【发布时间】:2012-09-04 23:26:37
【问题描述】:
我有一个非常复杂的 Backbone 应用程序,其中包含许多视图/模型和集合。
有时当用户单击一个按钮时,我需要更新多个集合并更新某些视图。
为了管理集合,我在路由器中处理了大多数事件。事件顺序如下:
用户点击链接/按钮并查看触发事件:
this.model.trigger('someEvent');
监听事件的模型,必要时更新自身并通过我的事件总线通知路由器
eventbus.trigger('globalEVent');
我的路由器正在监听全局事件,从缓存存储中获取集合/模型并更新必要的集合和模型。
到目前为止效果非常好,但是
我的事件太多了,我的路由器代码变得难以管理。我的问题是有没有办法处理路由器外部的事件并且仍然访问路由器内部的方法?我的方法是正确的还是我没有考虑过更优雅的解决方案?
更新:
我现在是这样做的:
在路由器中,我在 initialize() 中调用此方法:
registerModules : function() {
var self = this;
Backbone.trigger(Events.RegisterModule, function(moduleRoutes) {
_.each(moduleRoutes, function(moduleRoute) {
self.routeDetails[moduleRoute.name] = {
buildPageUrl: moduleRoute.buildPageUrl,
fragment : moduleRoute.fragment
}
self.route(moduleRoute.fragment, moduleRoute.name, moduleRoute.action);
});
});
},
然后我为每个自我注册的模块/页面设置了常规的自我执行块(简化版):
(function() {
var module = {
loadAndDisplay: function() {},
saveAndContinue: function(model) {
Backbone.trigger(Events.ChangePage, model.get('nextPage'));
},
registerEvents: function() {},
_init: function() {
module.registerEvents();
var self = this,
routes = [{
fragment: Constants.FRAGMENT,
name: Constants.PAGE_NAME,
buildPageUrl: function() {
return Constants.FRAGMENT;
},
action: module.loadAndDisplay
}];
Backbone.on(Events.RegisterModule, function(registerCallback) {
registerCallback.call(registerCallback, routes);
});
}
};
module._init();
})();
当然,您的路由器脚本应该在您的模块代码之前加载。它非常适合我的需求。通过这种设计,我完全分离了路由器/模块,它们彼此也不知道。每个都将处理自己的事件/数据等。共享逻辑进入路由器。
【问题讨论】:
-
你需要访问哪些方法?
标签: backbone.js backbone-events