如何在默认情况下将主干视图设置为singleton

How do I set Backbone Views as singleton by default?

本文关键字:视图 设置 singleton 默认 情况下      更新时间:2023-09-26

所有我的主干。视图在其最终状态下只使用一次。(项目视图除外)。

目前我处理Backbone。视图为Singleton的方式:

var Singletonizer = function(Singleton) {
    if (Singleton._instance) return Singleton._instance;
    Singleton._instance = new Singleton();
    Singletonizer(Singleton);
};

不幸的是,将这个小函数作为依赖项添加到我的存储库中的每个amd模块中并不是很好。

有其他方法可以解决这个问题吗?也许覆盖了基本视图类?

只需让您的模块在视图构造函数之外返回一个函数,该函数会返回它的一个实例,这与下面的没有什么不同。这样,当您加载模块时,无论您喜欢与否,都不会自动获得实例。相反,在加载"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;
    }
});

来自非常推荐的书籍《骨干食谱:》

从这里:

// 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类进行典型的扩展。然而,不同之处在于,我们确实而不是像前面那样将结果分配给类名。相反,我们立即创建这个匿名类的实例。最后,将MyApplication.ListView分配给生成的对象。

我不得不说,我从来没有使用过这样的技术。对我来说,它看起来很乱,我更喜欢易读性而不是建筑。