Backbone.js 路由器主干.js处理事件
我有一个非常复杂的主干应用程序,包含许多视图/模型和集合 当用户单击某个按钮时,我需要更新多个集合并更新某些视图 为了管理集合,我在路由器中处理了大多数事件。事件顺序如下: 用户单击链接/按钮,视图触发事件:Backbone.js 路由器主干.js处理事件,backbone.js,backbone-events,Backbone.js,Backbone Events,我有一个非常复杂的主干应用程序,包含许多视图/模型和集合 当用户单击某个按钮时,我需要更新多个集合并更新某些视图 为了管理集合,我在路由器中处理了大多数事件。事件顺序如下: 用户单击链接/按钮,视图触发事件: this.model.trigger('someEvent'); 监听事件的模型会在必要时自我更新,并通过我的事件总线通知路由器 eventbus.trigger('globalEVent'); 我的路由器正在侦听全局事件,从缓存存储中获取集合/模型,并更新必要的集合和模型 到目前为
this.model.trigger('someEvent');
监听事件的模型会在必要时自我更新,并通过我的事件总线通知路由器
eventbus.trigger('globalEVent');
我的路由器正在侦听全局事件,从缓存存储中获取集合/模型,并更新必要的集合和模型
到目前为止,这种方法确实很有效,但是
我有太多的事件,我的路由器代码变得难以管理。我的问题是,有没有一种方法可以处理路由器外部的事件,并且仍然可以访问路由器内部的方法?我的方法是正确的还是有一个更优雅的解决方案我没有考虑
更新:
我现在是这样做的:
在路由器中,我在initialize()中调用此方法:
然后,我为每个自注册的模块/页面提供常规的自执行块(简化版):
当然,您的路由器脚本应该在模块代码之前加载。它非常适合我的需要。通过这种设计,我完全分离了路由器/模块,它们彼此也不了解。每个都将处理自己的事件/数据等。共享逻辑进入路由器。您应该将路由器功能划分为不同的类。在我们基于木偶网的应用程序中,我们使用RegionManager来处理所有与视图相关的内容,如在不同区域中更改视图、打开覆盖等,以及状态机。路由器本身只是触发不同的事件,比如state:change或region:change,管理器类侦听的位置
通过这种方式,您可以使用不同的管理器类来处理应用程序的特定方面。让路由器了解他构建的目的:监听位置更改事件并通知应用程序。路由器不应该有其他逻辑,然后这个 您应该将路由器功能划分为不同的类。在我们基于木偶网的应用程序中,我们使用RegionManager来处理所有与视图相关的内容,如在不同区域中更改视图、打开覆盖等,以及状态机。路由器本身只是触发不同的事件,比如state:change或region:change,管理器类侦听的位置
通过这种方式,您可以使用不同的管理器类来处理应用程序的特定方面。让路由器了解他构建的目的:监听位置更改事件并通知应用程序。路由器不应该有其他逻辑,然后这个 你需要使用什么方法?你需要使用什么方法?我已经开始使用你提出的方法。谢谢,我已经朝着你提出的方法前进了。谢谢
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();
})();