从集合中删除绑定以从视图中删除
我有一个骨干集合,当我从集合中删除模型时,我希望它从视图中的列表中删除该项目。
我的收藏是非常基本的
MyApp.Collections.CurrentEvents = Backbone.Collection.extend({ model: MyApp.Models.Event });
并以我的观点看待
MyApp.Views.CurrentEventItem = Backbone.View.extend({ el: 'div.current_event', initialize: function(){ event = this.model; _.bindAll(this, "remove"); MyApp.CurrentEvents.bind('remove',this.remove); //the collection holding events this.render(); }, // yeah, yeah, render stuff here remove: function(){ console.log(this); $(this.el).unbind(); $(this.el).remove(); } });
当我从集合中删除模型时,它会触发remove函数,但视图仍然在页面上。 在控制台中,我可以看到模型,但我相信模型应该有'el',但它不会。
我的容器代码是
MyApp.Views.CurrentEventsHolder = Backbone.View.extend({ el: 'div#currentHolder', initialize: function(){ MyApp.CurrentEvents = new MyApp.Collections.CurrentEvents(); MyApp.CurrentEvents.bind('new', this.add); }, add: function(){ var add_event = new MyApp.Views.CurrentEventItem(added_event); $('div#currentHolder').append(add_event.el); } });
出于某种原因,在add
方法中,我似乎无法在追加前使用$(this.el)
,尽管我不确定这是否是问题。
问题: MyApp.CurrentEvents.bind('remove',this.remove);
这会在每次从集合中删除任何模型时触发remove()
函数。
这意味着,只要模型被删除, 所有 CurrentEventItem
视图实例都将被删除。
现在,关于仍然在页面上的视图:
它必须与您在页面中添加/添加/浏览视图的方式有关。 检查你的其他视图,也许如果你有某种CurrentEventsContainer
视图,检查你的代码,因为使用你当前的代码,它确实删除了视图,尽管如此,尽管如此。
推荐的修正:
将您的绑定更改为:
this.model.bind('remove',this.remove);
并确保在实例化它时,传递model
以便每个视图都具有相应的模型,如下所示:
//...
addAllItem: function(){
_.each(this.collection, this.addOneItem())
},
addOneItem: function(model){
var currentEventItem = new MyApp.Views.CurrentEventItem({model:model});
//...more code..
}
//...
在我看来,这使得管理变得更容易。
更新(从你更新的问题)
您无法使用this.el
的原因是因为您没有将正确的上下文传递给add()
函数。 您需要在initialize()
函数中添加_.bindAll(this,'add')
以传递正确的上下文,从而使您的this
正确,从而允许您在add
函数中使用this.el
另外,将您的代码更改为:
MyApp.CurrentEvents.bind('new', this.add, this);
这通过正确的上下文。 另外,为什么不将add
用作事件?
继续我在评论中所说的内容,现在你已经实现了这种方式,当它们中的任何一个从集合中被移除时,它们将从页面中删除所有CurrentEventItem
视图。 原因如下:
MyApp.CurrentEvents.bind('remove',this.remove);
这基本上就是说,“每次在集合上触发remove
事件时,都会调用this.remove
。” 因此,每当您实例化这些视图中的一个时,您还告诉集合在集合触发remove
事件时移除该视图。 我创建了一个小提示向你展示问题。
你说得对,Backbone知道哪个模型已经从一个集合中删除,但是你没有充分利用这一点。 你可以这样做:
removeFromView: function(model) {
// Check to make sure the model removed was this.model
if (model.cid === this.model.cid) {
$(this.el).unbind();
$(this.el).remove();
}
}
看看这种微小的调整如何改变行为? 在这里查看它的行动。
如果你遵循这种模式,你应该看到正确的视图被删除。
链接地址: http://www.djcxy.com/p/48313.html上一篇: remove from collection bind to remove from view
下一篇: backbone.js nested collection, add event fires, but returns parent model