管理骨干视图的模式

And*_*rle 20 design-patterns event-driven backbone.js

来自GWT,Backbone似乎错过了一个关于如何处理视图生命周期的内置解决方案.在GWT中,每个活动(或多或少等同于Backbone中的View)由ActivityManager管理,ActivityManager在活动上调用onStart/onStop,传递eventBus和可以呈现Activity的元素.停止时, ActivityManager将取消绑定活动绑定到eventbus的所有事件,并从DOM中删除视图.

在Backbone中,很容易将事件绑定到模型和集合,但您必须手动删除它们,并且没有通用的api方法可以执行此操作.

所以我正在寻找关于如何管理视图的最佳实践模式,以确保没有被杀死或被禁用的视图正在监听事件.

San*_*der 13

你是对的,还没有构建解决方案(还).

然而,当然可以扩展骨干以提供这种功能,Derick Bailey最近写了一篇关于此的博客文章,

看看这里:http: //lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

这绝不是圣杯,你可以按照自己的意愿自由实施,但这是一个非常直接的方法,处理僵尸视图,现在你仍然需要照顾其他生物在你的记忆中爬行,但这是至少从观点开始!


rob*_*les 5

我正在使用自定义BaseView,它扩展了Backbone的remove方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个问题:模型和集合需要手工处理,因为你不知道它是否被其他视图使用.


And*_*rle 3

看来Marionette终于具备了我正在寻找的功能。