我有一个collectionview
ItineraryEditorView
,它被换入和换出一个布局区域。collectionView
的同一个示例是使用region.show
换入的,而不是每次都为collectioView
创建新的示例。集合上的render方法调用delegateEvents()
方法。
ItineraryEditorView = Marionette.CollectionView.extend({
tagName: "div",
emptyView: EmptyItineraryDayView,
itemView: ItineraryDayView,
initialize: function (options) {
},
render: function() {
Marionette.CollectionView.prototype.render.apply(this);
this.delegateEvents();
},
});
通过关闭区域来交换视图:
plannerLayout.itineraryEditorRegion.close();
在视图中交换:
itineraryEditorView.delegateEvents();
plannerLayout.itineraryEditorRegion.show(itineraryEditorView);
删除模型是通过监听从itemView
到collectionView
的冒泡事件来完成的(可以工作,这里没有问题)
itineraryEditorView.on("itemview:delete:day", function(childView, model) {
days.remove(model); //days coll is passed in to coll view on instance creation
holiday.save();
});
我希望这足以确保在从基础days集合中删除模型时删除/关闭集合视图中的子itemViews
。我可以看到集合实际上被修改并保存在服务器上,但是集合视图并没有改变。2这种情况当然适用于集合视图第一次被换出之前的情况。在我再次访问另一个选项卡并返回到该选项卡后,视图确实会自动更新(因此呈现了整个集合-确认更改/删除)
解决这个问题的最好方法是什么?如果我重新创建集合视图的示例,它确实会导致代码中其他“on”句柄的丢失。
1条答案
按热度按时间mgdq6dx11#
不需要手动调用
delegateEvents
a- Backbone在视图的构造函数中执行此操作。当您关闭区域时,该区域将关闭视图,删除所有内部引用并解除所有事件的绑定,为垃圾收集做准备。一旦视图被close()
'd,它不应该被再次使用。解决你的问题的方法应该是将new
升级到你的ItineraryEditorView
的另一个示例,并将其传递到show
上的区域。另外,在调用
region.show(view)
之前,不必先调用region.close()
;show
做的第一件事是close()
当前视图(如果有的话)。我建议修改代码如下:...