我正在将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
模型的此实例?
答案 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-