来自GWT,Backbone似乎错过了一个关于如何处理视图生命周期的内置解决方案。在GWT中,每个活动(或多或少等同于Backbone中的View)由ActivityManager管理,ActivityManager在活动上调用onStart / onStop,传递eventBus和可以呈现Activity的元素。停止时, ActivityManager将取消绑定活动绑定到eventbus的所有事件,并从DOM中删除视图。
在Backbone中,很容易将事件绑定到模型和集合,但是您必须手动删除它们,并且没有通用的api方法可以执行此操作。
所以我正在寻找关于如何管理视图的最佳实践模式,以确保没有被杀死或被禁用的视图听不到事件。
答案 0 :(得分:13)
然而,当然可以扩展主干以提供此功能, Derick Bailey最近撰写了一篇关于此事的博客文章,
这绝不是圣杯,你可以按照自己的意愿自由实施,但这是一个非常直接的方法,处理僵尸的观点,现在你仍然需要照顾其他生物在你的记忆中爬行,但这至少是观点的开始!
答案 1 :(得分:5)
我正在使用自定义BaseView,它扩展了Backbone的删除方法:
app.BaseView = Backbone.View.extend({
views: [], // array to keep a ref of child-views for proper disposal later on
remove: function() {
// dispose any sub-views
_.each(this.views || [], function(view) {
view.remove();
});
// if the inheriting class defines a custom on-remove method, call it!
_.isFunction(this.onRemove) && this.onRemove();
// unbind all events from this view
this.off();
// finally, call Backbone's default remove method to
// remove the view from the DOM
Backbone.View.prototype.remove.call(this);
}
}
还有一个问题:模型和集合需要手工处理,因为你不知道它是否被其他视图使用过。
答案 2 :(得分:3)
似乎Marionette终于有functionality我正在寻找。
答案 3 :(得分:2)
我发布了我的解决方案,以便在https://github.com/thomasdao/Backbone-View-Manager管理视图。
视图管理器将始终在创建新视图之前清理现有视图。现在我将通过以下方式初始化一个新视图:
newView = VM.createView("newView", function(){
return new View();
};
如果我想重用视图而不是创建新视图,我可以使用
newView = VM.reuseView("newView", function() {
return new View();
}
VM.reuseView和VM.createView之间的区别在于,reuseView将查找名为“newView”的现有视图,如果发现它将返回给您。否则,它将执行回调函数和缓存结果。 VM.createView将始终执行回调函数并为您清理现有视图。因此,如果视图是动态的并经常更改
,您可能希望使用VM.createView