1

我在我的頁面有3個單獨的表,他們都得到填充視圖初始化並從我的後端REST API獲取他們的數據。獲取數據後,我將復位綁定到名爲paint的方法,並在該循環內部通過集合並構建表。Backbone.js多表數據操作

paintSelected: function (collection, options) { 
    collection.each(function (ch) { 
     var view = new ChannelViewDetailed({model: ch}); 
     view.setOwner(collection); 
     this.$el.find('#selected tr:eq(' + collection.indexOf(ch) + ')').after(view.render().el); 
    }, this); 
}, 

這將在我定義的下劃線模板上構造整個表格。所有這一切都很好,我可以處理刪除並在此頁面上的多個集合之間添加數據。

當我想在這個表上執行一個exclude allinclude all的操作時,事情會變得混亂,視圖擁有者會因爲我必須做的循環而丟失,重複出現在列表中,並且排序會丟失。

ChannelViewDetailed = Backbone.View.extend({ 
    tagName: 'tr', 
    template: _.template($('#tpl-channel-row-detailed').html()), 

    events: { 
     'click td.del': 'deleteSelected' 
    }, 

    setOwner: function (collection) { 
     this.owner = collection; 
    }, 

    render: function() { 
     this.$el.html(this.template(this.model.toJSON())); 
     return this; 
    }, 

    deleteSelected: function (e) { 
     e.preventDefault(); 
     this.owner.remove(this.model); 
     this.remove(); 
    } 
}); 

請注意,這是上述所有每項行動執行時工作正常,但如預期,當我wan't執行批量無法正常工作(包括所有/排除所有)操作。

這是排除我試圖完成的所有方法的示例。

excludeAllChannels: function (e) { 
     e.preventDefault(); 
     var self = this; 

     if (!$.isEmptyObject(self.selected)) { 
      _.each(this.selected.models, function (item, index, items) { 
       self.selected.remove(item); 
      }); 
      $('#in-channels tr').has('td').remove(); 
      unsavedState = true; 
     } 
    } 

回答

3

修改當前正在循環的數組可能會導致意外的結果。

https://jsfiddle.net/c0xpzq6v/

var a = new Backbone.Collection(data); 
_.each(a.models, function(item) { a.remove(item); }); 

可以通過以下任一

_.each(_.clone(a.models), function(item) { a.remove(item); }); 
a.remove(a.models); 
a.reset(); 
+0

我不知道你是怎麼做到的更換,而人它就像一個魅力! –

+0

強調['.reset()'](http://backbonejs.org/#Collection-reset)。 –

+0

,因爲在某些情況下,您會覆蓋重置綁定,[.clone()](http://underscorejs.org/#clone)是首選方式。 –