Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 多条匹配路径_Backbone.js - Fatal编程技术网

Backbone.js 多条匹配路径

Backbone.js 多条匹配路径,backbone.js,Backbone.js,我有一个backbone.js应用程序,它定义了两个控制器,控制器都定义了与location.hash匹配的路由模式。我很难让他们两个都开火 ManagerController = Backbone.Controller.extend({ routes: { ":name": "doStuff" }, doStuff : function(name) { console.log("doStuff called..."); } });

我有一个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...");
   }
});
因此,如果url是“http://mysite.com/#xyz123,然后我看到调用了'doStuff()',或者如果我注释掉该路由,则调用'doMoreStuff()。但不是两者都有

我之所以使用这种架构,是因为我的页面是高度面向组件的,每个组件都定义了自己的控制器。“组件管理器”还定义了一个控制器,该控制器对所有路由进行内部管理

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


科林:不,你不能那样做。每页一个控制器

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

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

主干网的一个优点是,如果您向它传递一个已经是正则表达式的路由,它将按原样使用它。因此,如果您试图使用控制器创建布局的可书签描述(显示模式“a”中右上角的组件1,显示模式“B”中左上角的组件2,等等),我可以建议许多备选方案——在URL的哈希部分为每一个配置一个名称空间,并创建忽略其余部分的路由,即

routes: {
    new RegExp('^([^\/]*)/.*$'): 'doComponent1stuff',
    new RegExp('^[^\/]*/([^\/]*)\/.*$': 'doComponent2stuff',
}
看看第一个只在第一个斜杠后使用项目,第二个在第二个斜杠后使用项目,等等。你可以完全按照你想要的方式对你的魔法进行编码


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

我有一个非常类似的问题。目前,主干网在第一条匹配路由后停止。我有一个肮脏的解决方法,我覆盖主干历史的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;
  }
})
从理论上讲,我对每页使用一个控制器很满意。但是,在基于组件的视图框架中,最好每个管线有多个视图来呈现视图状态的不同部分


欢迎评论。

我使用名称空间来处理类似的问题。每个模块都有自己的模块控制器,但仅限于处理以/moduleName/开头的路由,这样模块就可以独立开发。

我还没有完全测试过这一点,如果您查看一下Backbone.js源代码,您可以在第1449行看到:

// Attempt to load the current URL fragment. If a route succeeds with a
// match, returns `true`. If no defined routes matches the fragment,
// returns `false`.
loadUrl: function(fragment) {
  fragment = this.fragment = this.getFragment(fragment);
  return _.any(this.handlers, function(handler) {
    if (handler.route.test(fragment)) {
      handler.callback(fragment);
      return true;
    }
  });
}

any方法将在匹配处理程序路由时立即停止(使用“return true”),只需注释返回,短路将永远不会发生,所有处理程序都将被测试。用一个有两个模块的木偶应用程序对此进行了测试,每个模块都有自己的路由器和控制器,监听相同的路由并启动了两个模块。

我认为这是解决此问题的最简单方法

路线:{ '''userGrid', “用户”:“用户网格”,
}

谢谢Elf-在这种情况下,页面任意包含来自不同开发人员的组件,因此我无法显式地对控制器进行预编码。一次只有一个组件可见,其他组件在DOM中,但隐藏。散列包含以下部分://*。第一个用于标识要显示的组件,其余的用于该组件。根据您所说的,我可以尝试一种方法,其中每个组件向主控制器注册一个路由和回调,主控制器负责路由和代理回调。我想这是一个自定义的委托控制器模式。助教,埃尔夫,几处更正。1) 一个页面上可以有任意多个控制器(现在称为路由器)。主干网只需在历史单例中预先设置路由定义。2) 最后输入的路线检查顺序=第一次检查。这真的太糟糕了;对于主干开发人员来说,这似乎有点目光短浅,因为有充分的理由可以解释为什么您希望页面的多个部分不必彼此紧密关联才能正常工作。并不是每个人都希望“一个页面控制器来管理所有页面”。没有什么可以阻止您拥有多个不紧密相关的页面部分。我一直都是这样做的。路由器不必是页面控制器。如果你想要一个具有可书签的个人视图的单页应用程序,你可以使用路由器。