我的所有Backbone.Views仅在最终状态下使用一次。 (项目视图除外)。
目前我以这种方式将Backbone.Views作为Singleton处理:
var Singletonizer = function(Singleton) {
if (Singleton._instance) return Singleton._instance;
Singleton._instance = new Singleton();
Singletonizer(Singleton);
};
不幸的是,将这个小函数作为依赖项添加到我的存储库中的每个amd模块并不是很好。
还有另一种方法可以解决这个问题吗?也许覆盖基础视图类?
答案 0 :(得分:6)
让你的模块返回一个除了你的视图构造函数之外的函数,一个返回它的单个实例的函数,与下面不同。这样,当您加载模块时,无论您是否喜欢,都不会自动获取实例。相反,在加载我们的“FailedXhrView”模块后,我们通过调用FailedXhrView()
'use strict';
define(['jquery',
'underscore',
'backbone',
'text!templates/failedXhr.html'],
function($, _, Backbone, failedXhrTemplate) {
var FailedXhrView = Backbone.View.extend({
el : $('#failedxhr-modal-container'),
template : _.template(failedXhrTemplate),
render : function() {
this.$el.html(this.template({}));
this.$el.find('failedxhr-modal-containee').modal();
return this;
}
});
var instance;
return function() {
if (!instance) {
instance = new FailedXhrView();
}
return instance;
}
});
答案 1 :(得分:4)
从非常值得推荐的书Recipes with Backbone:
从这里开始:
// definition
MyApplication.Views.List = Backbone.View.extend();
// instantiation
$(function() {
MyApplication.ListView = new MyApplication.Views.List({
el: $('#list')
});
})
到这里:
$(function() {
MyApplication.ListView = new (Backbone.View.extend({
initialize: function() {
// ...
}
}))({el: $('#list')})
});
我们将匿名类的实例化分配给
MyApplication.ListView
。在这种方法中,我们使用自定义属性和方法进行顶级Backbone类的典型扩展。然而,不同之处在于我们 not 将结果分配给类名,就像我们之前所做的那样。相反,我们立即创建此匿名类的 new 实例。最后,MyApplication.ListView
被分配给结果对象。
我不得不说我从未使用过这样的技术。对我来说它看起来很混乱,我更喜欢易读性而不是建筑。