多条匹配路线

haw*_*ett 12 backbone.js

我有一个定义两个控制器的backbone.js应用程序,控制器都定义了与location.hash匹配的路由模式.我无法解决这两个问题 - 例如

ManagerController = Backbone.Controller.extend({
   routes: {
      ":name":      "doStuff"
   },

   doStuff : function(name) {
      console.log("doStuff called...");
   }
});

Component1Controller = Backbone.Controller.extend({
   routes: {
      "xyz123":      "doMoreStuff"
   },

   doMoreStuff : function() {
      console.log("doMoreStuff called...");
   }
});
Run Code Online (Sandbox Code Playgroud)

所以如果url是"http://mysite.com/#xyz123",那么我看到'doStuff()'被调用,或者如果我注释掉那条路线,那么调用'doMoreStuff()'.但不是两个.

我正在使用这种架构,因为我的页面是高度面向组件的,每个组件都定义了自己的Controller."组件管理器"还定义了一个控制器,它在所有路径上进行一些管理.

我是否应该能够配置两个响应相同路由的控制器?干杯,

科林

Elf*_*erg 15

简答:不,你做不到.每页一个控制器.

答案很长:当您实例化一个新的Controller时,它会将其路由添加到History单例中.历史单例监视URL的哈希组件,当哈希更改时,它会扫描路由以查找与其需要匹配的第一个表达式.然后它会触发与该路由关联的函数(该函数已绑定到声明它的控制器).它只会发射一次,如果发生冲突,它发射的顺序正式不确定.(在实践中,它可能是确定性的.)

哲学答案:控制器是一个"视图"对象,它根据URL的哈希组件影响整个页面的表示.其目的是提供用户可以在将来访问的具有书签功能的URL,以便当他访问URL时,他可以从许多预先选择的视图开始.根据您的描述,听起来您正在操纵这个公开暴露的,可手动寻址的项目来操纵视口的不同部分,同时让其他部分独立.这不是它的工作原理.

关于Backbone的一个好处是,如果你传递一个已经是正则表达式的路由,它将按原样使用它.因此,如果您尝试使用控制器创建布局的可收藏描述(显示模式"A"右上角的组件1,显示模式"B"左上角的组件2等)我可以建议一些替代方案 - 在URL的哈希部分中为每个命名空间分配一个命名空间,并创建忽略其余部分的路由,即

routes: {
    new RegExp('^([^\/]*)/.*$'): 'doComponent1stuff',
    new RegExp('^[^\/]*/([^\/]*)\/.*$': 'doComponent2stuff',
}
Run Code Online (Sandbox Code Playgroud)

看看第一个斜杠后第一个使用的项目,第二个斜杠后面的第二个等等.你可以完全按照你想要的方式编码你的魔法.

不过,我建议,如果你要对组件的外观和感觉做些什么,并且你希望它具有合理的持久性,那么你可以查看从一些本地商店获取和设置cookie的视图; 如果它们足够小,那么饼干就足够了.


小智 7

我有一个非常相似的问题.目前,骨干在第一条匹配路线后停止.我有一个肮脏的解决方法,我将覆盖Backbone History的loadUrl方法.在这里,我将遍历所有已注册的路由并触发所有匹配路由的回调.

_.extend(Backbone.History.prototype, {
  loadUrl : function() {
    var fragment = this.fragment = this.getFragment();
    var matched = false;
    _.each(this.handlers, function(handler) {
      if (handler.route.test(fragment)) {
        handler.callback(fragment);
        matched = true;
      }
    });
    return matched;
  }
})
Run Code Online (Sandbox Code Playgroud)

从哲学上讲,我每页只有一个控制器就可以了.但是,在基于组件的视图框架中,每个路由有多个视图呈现视图状态的不同部分会很好.

欢迎评论.