【问题标题】:router backbone.js handle events路由器主干.js 处理事件
【发布时间】: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


【解决方案1】:

您应该将路由器功能分成不同的类。在我们基于 Marionette 的应用程序中,我们使用 RegionManager 来处理所有与视图相关的内容,例如在不同区域更改视图、打开叠加层等和 StateMachine。路由器本身只是触发不同的事件,例如管理器类监听的 state:change 或 region:change。

按照这种方式,您可以使用不同的管理器类来处理应用程序的特殊方面。让路由器执行他的构建目标:监听位置变化事件并通知应用程序。路由器不应该有其他逻辑然后这个。

【讨论】:

  • 我已经朝着你提出的方法迈进了。谢谢
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多