使用RequireJS的BackboneJS路由器中的全局变量

Ale*_*lex 5 javascript requirejs backbone.js

我正在使用带有RequireJS的BackboneJS来构建我正在构建的应用程序.

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

// Define application router
var router = new AppRouter();
Backbone.history.start();
Run Code Online (Sandbox Code Playgroud)

然后路由器控制系统操作.

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');
    }

});
Run Code Online (Sandbox Code Playgroud)

我添加了一个Dashboard模型和视图,用于在任何给定时间显示有关系统状态的全局信息.(这将位于窗口的顶部).它的视图监视其模型,以便在必要时更改值和重新呈现.这很好用.

我想,以避免重新写这个曾经我最初的对象实例化后:

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

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

如何以及在何处定义此Dashboard模型的实例?

Kai*_*izo 13

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

您正在寻找的是单身人士模式:

意图:

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

执行:

  • (...)Singleton Pattern定义了一个getInstance操作,它暴露了客户端访问的un ique实例.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;
    };
});
Run Code Online (Sandbox Code Playgroud)

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

var DashboardModel = require("DashboardModel"); //or from the define arguments
var dashboard = DashboardModel.getInstance();
Run Code Online (Sandbox Code Playgroud)