您能否提供一个重现您的案例的jsfiddle?因为您通常可以这样做(我个人有一个应用程序实例化路由器,启动历史记录,实例化其他几个,它工作得非常好。)
在此之前,这里有一些关于路由器的信息:
- 当您实例化路由器时,路由绑定到 Backbone.history (一个唯一对象)
- 这意味着您不能期望两个路由器都执行回调
- 它也意味着有一个固定的顺序:将首先检查最后实例化的路由器的路由
编辑:
好的,我猜您希望执行两条路线,因为您希望有人直接进入 tab1/stuff。
丑陋的方式:您可以停止 Backbone.history (Backbone.history.stop()) 并在之后立即启动它,router2 的路由将被绑定......
其他可能性:您为什么不将所有路由放在主路由器中?好吧,我想如果你真的有太多,那是可以理解的。
最后一种可能性(我能想到的):使用最后一个路由器的路由首先测试的事实,这就是您所需要的。更改主路由器的路由,添加一个通用路由来满足您的需要(例如 tab1)。不要做任何事情,向后导航到 /tab1。准备 2 个导航,如下所示:
this.navigate('/tab1', {trigger: true});
this.once('someEvent', function() {
this.navigate('/tab1/stuff', {trigger: true});
});
如果您有足够通用的 URL,则可以将 tab1 & stuff 替换为您将与通用路由匹配的参数。
编辑 2:
好的,这是一个编辑,假设我在上一条评论中写了所有内容,并且您使用主题标签(或 URL)访问您的主干视图,例如视图/操作。我会尽量做到更彻底(因为我仍然没有你问题的所有细节)。
这个jsfiddle显示了原理。现在,它仍然会与客户的历史记录混淆(我认为在 Backbone 中可能有一种方法可以避免这种情况,如果这对你来说是个问题,你必须调查一下)。
现在,事实上可能还有其他几个问题。其中最少的可能是辅助路由器中的样板(您必须将view/放在任何路由之前)。有解决方案,但这太深入了。更大的一个是:
我已经说过了,但是只会匹配一个路由。因此,您的主路由器不能用于处理客户端将更改视图的事实(例如从view1/action1到view2/action2,router2 之前已经加载)。action2 将被执行,但如果您在主路由器中重新加载视图,则不会执行此操作。
就像最后一条评论一样,您可以在创建主路由器后修改路由器核心初始化方法以添加样板行为(重新加载您的视图?):这是一个可能适合您的示例。