我正在使用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;
});
两个问题: