20

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

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

因此,我正在寻找有关如何管理视图以确保没有被杀死或禁用的视图正在监听不必要的事件的最佳实践模式。

4

4 回答 4

13

你是对的,(还)没有内置解决方案。

但是当然可以扩展骨干网来提供这个功能,Derick Bailey 最近写了一篇关于这个的博客文章,

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

这绝不是圣杯,你可以随心所欲地实现,但这是一种非常直接的方法,对于处理僵尸视图,现在你仍然需要照顾其他在你的记忆中爬行的生物,但这是至少从观点开始!

于 2011-12-02T01:20:03.617 回答
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);
    }
}

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

于 2012-03-25T03:01:27.723 回答
3

似乎木偶终于有了我正在寻找的功能。

于 2012-07-06T20:46:26.040 回答
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

于 2012-04-26T09:42:39.927 回答