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)是首选方式。 –