Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用RequireJS的BackboneJS路由器中的全局变量_Javascript_Backbone.js_Requirejs - Fatal编程技术网

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

Javascript 使用RequireJS的BackboneJS路由器中的全局变量,javascript,backbone.js,requirejs,Javascript,Backbone.js,Requirejs,我正在为我正在构建的应用程序使用BackboneJS和RequireJS App文件初始化路由器: // Define application router var router = new AppRouter(); Backbone.history.start(); 然后路由器控制系统动作 var App = Backbone.Router.extend({ routes: { "project/:id": "getProject", "proje

我正在为我正在构建的应用程序使用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');
    }

});
我添加了一个
仪表板
模型和视图,用于显示任何给定时间系统状态的全局信息。(这将位于窗口顶部)。其视图监视其模型以更改值,并在必要时重新渲染。这个很好用

我希望避免在初始对象实例化后重新编写此代码:

var dashboard = new DashboardModel();
var dashboardView = new DashboardView({ model: dashboard });
$('#dashboard-placeholder').html(dashboardView.render().el);
不过,我需要的是能够在任何地方访问此对象(我的
仪表板
模型的一个实例)。目前我在
App
中初始化它,但如果我这样做,我就无法在路由器中访问它。我真的不想在路由器中定义它,因为这感觉不是路由器要执行的正确任务

如何以及在何处定义我的
仪表板
模型的此实例

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

您需要的是:

意图:

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

  • (…)Singleton模式定义了一个getInstance操作,该操作公开了 客户端访问的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;
    };
});
现在,每次需要DashboardModel实例时,只需调用:

var DashboardModel = require("DashboardModel"); //or from the define arguments
var dashboard = DashboardModel.getInstance();

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

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

请参阅AMDjs api文档

精彩的答案,非常感谢。我想到了单例方法,但仍然不确定如何创建静态方法!很好,谢谢你。