【问题标题】:How do I set Backbone Views as singleton by default?默认情况下,如何将主干视图设置为单例?
【发布时间】:2012-08-31 16:28:04
【问题描述】:

我所有的 Backbone.Views 仅在其最终状态下使用一次。 (项目视图除外)。

目前我以这种方式将 Backbone.Views 处理为 Singleton:

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

    Singleton._instance = new Singleton();

    Singletonizer(Singleton);
};

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

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

【问题讨论】:

    标签: javascript backbone.js singleton amd


    【解决方案1】:

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

    【讨论】:

    • 与其从 IMO 模块返回实例化的 FailedXhrView 不如创建一个“单例”模块,该模块仅将 FailedXhrView 作为依赖项,然后返回一个实例化的实例。这为您测试原始模块提供了更多的灵活性,因为您可能希望在测试本身中实例化它。
    【解决方案2】:

    来自非常值得推荐的书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 类进行典型扩展。然而,不同之处在于我们将结果分配给我们之前所做的类名。相反,我们立即创建这个匿名类的 new 实例。最后,MyApplication.ListView 被分配给结果对象。

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

    【讨论】:

    • 嗨,我还是不明白这个模式背后的逻辑。第二个不应该创建第二个对象吗?
    • 第二个对象?我不明白你是什么意思。通过第二个实现,您可以获得一个已为您方便定制的即时Backbone.View,并且无法创建新的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2010-12-11
    • 2022-12-11
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多