5

我正在将 BackboneJS 与 RequireJS 一起用于我正在构建的应用程序。

一个App文件初始化路由器:

// Define application router
var router = new AppRouter();
Backbone.history.start();

然后路由器控制系统动作。

var App = Backbone.Router.extend({

    routes: {

        "project/:id": "getProject",
        "projects": "getProjects",
        "*actions": "defaultRoute"
    },

    getProject: function (id) {
       // dashboard.set('some_key', 'some_value');
    },

    getProjects: function () {
       // dashboard.set('some_key', 'some_value');
    },

    defaultRoute: function () {
       // dashboard.set('some_key', 'some_value');
    }

});

我添加了一个Dashboard模型和视图,用于在任何给定时间显示有关系统状态的全局信息。(这将位于窗口的顶部)。它的视图监视其模型以更改值并在必要时重新渲染。这工作正常。

我想避免在我的初始对象实例化之后重新编写它:

var dashboard = new DashboardModel();
var dashboardView = new DashboardView({ model: dashboard });
$('#dashboard-placeholder').html(dashboardView.render().el);

不过,我需要的是能够在任何地方访问这个对象(我的Dashboard模型的一个实例)。目前我将其初始化,App但如果我这样做,我将无法在路由器中访问它。我真的不想在路由器中定义它,因为这感觉不是路由器执行的正确任务。

如何以及在哪里定义我的Dashboard模型的这个实例?

4

2 回答 2

13

我需要的是能够在任何地方访问这个对象

您正在寻找的是单例模式

意图:

  • 确保只创建一个类的一个实例。
  • 提供对对象的全局访问点。

执行:

  • (...)单例模式定义了一个 getInstance 操作,该操作公开了客户端访问的唯一实例。getInstance() 负责在尚未创建的情况下创建其类唯一实例并返回该实例。

这就是你如何实现它:

define("DashboardModel", function () {
    var instance;

    var DashboardModel = Backbone.Model.extend({
        (...)
    });

    // Static method
    DashboardModel.getInstance = function () {
        // "instance" can be "this.instance" (static property) 
        // but it is better if it is private
        if (!instance) {
            instance = new DashboardModel();
        }
        return instance;
    };
});

现在,每次您需要 DashboardModel 实例时,您只需调用:

var DashboardModel = require("DashboardModel"); //or from the define arguments
var dashboard = DashboardModel.getInstance();
于 2013-06-26T15:52:40.380 回答
2

Singleton 是一个显而易见的选择,但我认为您也可以在新的模块定义中创建模型的实例。

define("MyX", "MyXModel", function(MyXModel){
    return new MyXModel();
});

请参阅 AMDjs api 文档https://github.com/amdjs/amdjs-api/wiki/AMD#factory-

于 2014-04-20T15:15:03.850 回答