2013-03-28 122 views
1

所以我有点问题。骨干路由,backbone.history启动后的多个路由器

我处于一种情况,我需要有多个Backbone.Routers来处理他们自己的路由等等,我根据主路由器(路由器1在下面的例子中)知道路由而动态加载它们目前。

我遇到的主要问题是这样的。

  • Router1的负载
  • Backbone.history.start()
  • Router1的负载路由器2
  • 路由器2这么想的做任何事情,因为历史已经开始已经

是否有任何可能的方式我可以让router2查看当前历史碎片,而无需再次调用router1中的路由?

IE不会手动调用Backbone.history.loadUrl(Backbone.history.getFragment());

编辑:

主要目标是,现在我有两个看法和良好显然希望按次路由器。有一个巨大的路由器考虑到将来可能会有n个知道每个单独视图的视图是没有意义的。

+0

如果您需要一种动态的路径处理方式,并且您的主路由器将决定如何生成这些动态路由,为什么不创建一个正则表达式和回调函数的Backbone集合,用于您的第二条路由并同时通过URL,正则表达式和回调函数到你的主路由器中的一个方法。这通常是如何处理路线的。只是一种方式,我相信有一个更好的方法来做到这一点。 – Kalpers 2013-03-28 11:39:46

+0

嗯,这可能工作,你有任何方法的细节? – adrian 2013-03-28 15:52:32

回答

0

你能否提供一个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}); 
}); 

如果你有足够的通用网址,你可以用你会配合您的通用路由参数取代TAB1 &东西。

编辑2:
确定这里是一个编辑假设一切,我在我的最后评论中写道,并说你哈希标签(或URL),例如查看/动作访问骨干的意见。我会尽我所能地做得更彻底(因为我还没有解决问题的所有细节)。

This jsfiddle显示了原理。现在,仍然存在这样的事实:它会混淆客户的历史(可能有一种方法可以避免在我认为的Backbone中,如果这对您来说是个问题,您必须查看一下)。

现在,事实上可能有其他几个问题。其中最小的可能是辅助路由器中的样板(您必须在任何路由之前放置视图/)。有解决方案,但那会太深入。较大的是以下几点:
我已经说过了,但只有一条路线可以匹配。所以你的主路由器可以用来处理客户端将改变视图的事实(比如从view1/action1view2/action2,router2已经在之前加载)。 action2将会被执行,但是如果你在你的主路由器上重新载入了你的视图,那就不会这样做了。
作为最后一条评论,您可以在创建主路由器以添加样板行为(重新加载视图?)后修改路由器核心初始化方法:here's an example这可能适合您。

+0

https://gist.github.com/amchang/5264260,你会得到主要想法,理想情况下,在这种情况下,我希望router2路由即使在历史记录启动时没有技术创建时也能运行。 – adrian 2013-03-28 15:50:54

+0

因此,你最后的建议是你基本上说它的特殊情况,等待'异步'事件,然后手动导航? – adrian 2013-03-28 18:00:11

+0

这是我的代码中的一部分,我担心'异步'事件是我添加的东西(在家里我现在无法查看它,我会明天检查)。但是这个想法是听一些会告诉你可以再次导航的东西,因为所有的东西都被加载了(这里是你的第二个路由器)。 – Loamhoof 2013-03-28 18:16:57

2

我建议你看看MarionetteJS这是一个用Backbone构建复合应用程序的好框架。具体看一下MarionetteJS example app的源代码。它所做的是将应用程序分成几个子应用程序。每个子应用程序都有自己的路由器,但它们都定义了父应用程序上的独立路由器。当父应用程序初始化时,所有路由器都会创建,然后只调用Backbone.history.start()。我意识到这个答案要求你深入研究具有陡峭学习曲线的木偶,但我认为这是完全值得的。我们已经在其上构建了SOOMLA designer web-app的整个架构。当您想要超越您的重复Backbone样板代码时,Marionette已被证明是一个很好的解决方案。荣誉Derick Bailey为一个很棒的开源框架。