0

我正在創建一個集合而不使用fectch(),但是已經有了JSON數據。BackboneJS捕獲事件OnAdd從初始加載

this.displays = new Displays(jQuery.parseJSON($('#temp_json').html())); 

我需要的是集合有一個「位置」值設置,這應該是這種模式在此集合中的位置,每一個模型。

我想要做的是捕捉一個事件,在初始加載中,每個模型都是從JSON構建的並添加到集合中。

我會那麼做一樣的東西:

theModel.set('position', this.length); 

不幸的是我無法找到我要我的收藏綁定到該事件。 此集合的模型還包含其他集合(...),其中應該完成相同的操作。

這可能似乎不可思議,但我必須在我看來這樣做,因爲以後我會的東西[執行類似:

var prototypeNames = [this.model.get('display').get('position'), this.model.get('position')]; 

希望這是非常明顯的。 謝謝!

回答

0

解決方案:

我用backboneRelational,與實際模型關係工作時,這是真棒。 我正在監聽構建它時爲集合中每個項目觸發的「關係:添加」。

然後,我在我的物品上設置了一些值,並觸發了一個新的事件'postAdd',可以從我的視圖中收聽。

window.Displays = Backbone.Collection.extend({ 
    model: Display, 
    initialize: function(data, options){ 
     this.on("relational:add", function(relModel){ 
      relModel.set('pos',this.indexOf(relModel)); 
      this.trigger('postAdd', relModel); 
     }, this); 
    }, 

}); 
1

Collection.add -function發生了一個add-事件,您可以使用on-功能收聽。該事件通過添加的模型和選項對象,其中包含一些有用的屬性(如添加模型的索引)作爲參數。 (documentation here

所以,你會做這樣的事情:

collection.on('add', function(model, options) { 
    model.set('position', options.index); 
}); 
如果您想了解更多關於 add -event傳遞參數,只要登錄他們,因爲現有的文件是在缺乏

最好。

collection.on('add', function(model, options) { 
    console.log(options); 
}); 

希望這有助於!爲我工作

+0

如果我沒有弄錯,這個事件在構建集合時沒有觸發,如果它包含多個項目。所以onLoad這不會被觸發,這是我需要的。 – LEM01 2012-08-02 11:42:37

0

您可以覆蓋默認的「添加」執行收集的觸發將不會被骨幹沉默自定義事件。

var MyCollection = Backbone.Collection.extend({ 

    // Override the default 'add' implementation... 
    add: function(models, options) { 

    // Call the default implementation first... 
    Backbone.Collection.prototype.add.apply(this, arguments); 

    // Fire our custom events on the models... 
    while (model = models.shift()) { 
     model.trigger('customAdd', model, this, options); 
    } 

    return this; 
    } 

}); 

現在,您可以收聽到「customAdd」事件觸發的模型。這一個將永遠被觸發,事件時沉默=真。因此,當用{silent:false}添加一個項目時,會觸發兩個事件:'add'和'customAdd'。

我已經使用這種技術來激發一個事件,當一個新的集合最初加載並創建所有模型時。由於initialize方法將在創建模型之前調用,因此我需要重寫'reset'函數以觸發我的代碼在模型創建時執行。