2014-04-01 70 views
0

我需要我的Backbone.Collection.extend()內的兩個url屬性,因爲如果一個集合是fetched那麼我需要使用特定url如果集合獲得一個新的模型,然後我想改變url檢查骨幹網是否已被提取或更改?

module.exports = MessagesCollection = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
     this.id = options.id; 
    }, 
    url: function() { 
     if (fetch method is called) { 
      return '/api/messages/' + this.id; 
     } else { 
      // here if a model is being added? 
      return '/api/messages' 
     } 
    }, 
    model: MessageModel 
}); 

原因這是因爲我只想根據用戶從服務器上拉下模型。

var me = new MeModel();  
me.fetch({ 
    success: function(response) { 
     App.data.me = me; 
     var messages = new MessagesCollection([], { id: response.get('user_id') }); 
     messages.fetch({ 
      success: function() { 
       App.data.messages = messages; 
       App.core.vent.trigger('app:start'); 
      } 
     }); 

    } 
}); 

當用戶在應用程序內創建新模型時,我希望它進入主集合?

這是否意味着我應該創建一個基於主集合的子集合?

編輯:

我創建這個樣子的其他地方的應用window.App.data.messages.create(Message);我想也許我可以寫類似

var me = new MeModel();  
    me.fetch({ 
     success: function(response) { 
      App.data.me = me; 
      var messages = new MessagesCollection([], { id: response.get('user_id') }); 
      var allMessages = new MessagesCollection(); 
      messages.fetch({ 
       success: function() { 
        App.data.messages = messages; 
        App.data.allMessages = allMessages; 
        App.core.vent.trigger('app:start'); 
       } 
      }); 

     } 
    }); 

然後創建window.App.data.allMessages.create(Message);>這聽起來像它可能會導致問題IDK有什麼想法?

編輯:

以上的工作,但我不得不創建一個新的Backbone.Collection.extend()傳球同樣的模式,但只寫它像

var Backbone = require('backbone'), 
    MessageModel = require('../models/message'); 

module.exports = AllMessagesCollection = Backbone.Collection.extend({ 
    model: MessageModel, 
    url: '/api/messages' 
}); 

因此,讓我真正打破了這個問題了,是這樣的解決方案有問題。做這個的最好方式是什麼?我能想到的最糟糕的事情就是帶寬,使用這種方法我會不斷地發送請求!

回答

1

如果需要只使用不同的URL時,創建新的模型,你可以重寫collection.create方法:

var MessagesCollection = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
     this.id = options.id; 
    }, 
    url: function() { 
     return '/api/messages/' + this.id; 
    }, 
    create: function(model, options){ 
     var extendedOptions = _.extend(options || {}, {url: '/api/messages'}); 
     return this.constructor.__super__.create.call(this, model, extendedOptions); 
    } 
}); 
+0

感謝現在開始測試吧... –

+0

好它的工作原理謝謝...我知道我需要重寫的東西,我不知道當你在'Backbone.Collection.extend'中創建一個方法時,你重寫了默認方法。酷學到了一些東西 –

+0

看着'create'方法,它看起來像胡言亂語,希望我能推動自己去理解它......但是,幹得好,你怎麼知道這個數字?你看看backbone.js源代碼嗎? –