8

我有一个模型需要由多个视图访问,并在模型模块的定义中完成此操作,我将立即实例化它,如下所示:

define([
    'jquery',
    'underscore',
    'backbone'
], function(_, Backbone) {
    var Foo = Backbone.Model.extend({
        // wondrous methods and properties
    });

    return new Foo();
});

我只需要这个模型的一个实例——现在就是这样。据我所知,解决方法是有一个单独的App模块。就像是:

define([], function() {
    var App = {
        routers: {},
        models: {},
        views: {}
    };

    return App;
});

您可以在其上实例化和存储应用程序启动时对对象的引用:

require([
    'App',
    'Foo'
], function(App, Foo) {
    App.models.foo = new Foo();
});

但我觉得这是一个糟糕的选择,因为你基本上要回到拥有一个全局命名空间——这是 RequireJS 应该帮助避免的事情。

是否有任何替代方案,是否有充分的理由避免使用如上所述的单例模型?

4

2 回答 2

5

嗯.. 我一直在使用 RequireJS 模块作为 Singleton 对象一段时间没有问题。这是我问的一个相关问题。

将 requireJS 模块用作单例是一种不好的做法吗?

希望这可以帮助!

于 2012-09-21T06:04:48.583 回答
3

您不需要创建命名空间的东西。您的第一个示例创建了一个单例。每当您需要此模块时,您都会获得模型的相同实例。因此,无需创建新的 App 模块并将实例保存在那里,只需直接要求您的第一个示例的模块即可。我们在我们的应用程序中使用它来拥有我们应用程序的单例实例,我看不出有什么陷阱。

于 2012-09-21T07:09:41.853 回答