在窗口上调用stopListening为所有视图卸载?

时间:2014-02-15 22:38:50

标签: javascript marionette backbone-views

我正在使用Google Chrome扩展程序,其中包含临时前台页面和永久背景页面。

前景中的视图听取后台持有的模型。最终,前景窗口被卸载,但后台的模型仍然存在。所以,我需要确保每当窗口卸载时所有前景视图都调用stopListening。

我目前的解决方案有点草率和手动。我已经实现了ForegroundViewManager模型:

define(function () {
    'use strict';

    var ForegroundViewManager = Backbone.Model.extend({

        defaults: function () {
            return {
                views: []
            };
        },

        initialize: function() {
            $(window).unload(function () {
                this.allViewsStopListening();
            }.bind(this));
        },

        allViewsStopListening: function() {
            _.each(this.get('views'), function(view) {
                view.stopListening();
            });
        },

        subscribe: function (view) {
            var views = this.get('views');
            var index = views.indexOf(view);

            if (index === -1) {
                views.push(view);
            }
        },

        unsubscribe: function (view) {
            var views = this.get('views');
            var index = views.indexOf(view);

            if (index > -1) {
                views.splice(index, 1);
            }
        }

    });

    return new ForegroundViewManager();
});

然后我确保在每个视图的初始化中调用subscribe:

define([
    'foreground/model/foregroundViewManager'
], function (ForegroundViewManager) {
    'use strict';

    var ExampleItemView = Backbone.Marionette.View.extend({

        initialize: function() {
            ForegroundViewManager.subscribe(this);
        }

    });

    return ExampleItemView;
});

两个问题:

  • 使用ForegroundViewManager是个好主意吗?每个视图是否应单独绑定到window.unload而不是让管理器绑定一次并迭代订阅?
  • 有没有办法让调用订阅隐式?

0 个答案:

没有答案