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

时间:2013-06-26 15:23:04

标签: 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",
        "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模型和视图,用于在任何给定时间显示有关系统状态的全局信息。 (这将位于窗口的顶部)。它的视图监视其模型,以便在必要时更改值和重新呈现。这很好。

我希望避免在初始对象实例化后重新编写 ever

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

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

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

2 个答案:

答案 0 :(得分:13)

  

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

您要找的是singleton pattern

  

意图:

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

实现:

     
      
  • (...)Singleton Pattern定义了一个暴露un的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();

答案 1 :(得分:2)

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

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

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