骨干路由,骨干后的多个路由器。历史开始

时间:2013-03-28 01:31:49

标签: javascript backbone.js backbone-routing

所以我有点问题。

我的情况是我需要有多个Backbone.Routers,它们相应地处理自己的路由等等。我根据主路由器(以下示例中的路由器1)了解当前路由动态加载它们

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

  • 路由器1加载
  • Backbone.history.start()
  • Router1加载Router2
  • 路由器2不做任何事情,因为历史已经开始

有没有办法让router2查看当前的历史片段,而不必再次调用router1中的路由?

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

编辑:

主要目标是,现在我有两个视图,很明显,每个视图都有一个路由器。考虑到将来可能有n个视图可以了解每个单独的视图,因此拥有一个巨大的路由器是没有意义的。

2 个答案:

答案 0 :(得分:2)

我建议您尝试查看MarionetteJS,它是使用Backbone构建复合应用程序的一个很好的框架。具体来看MarionetteJS example app的源代码。它的作用是将应用程序分成几个子应用程序。每个子应用程序都有自己的路由器,但它们都在父应用程序上定义了单独的路由器。当父应用程序初始化时,将创建所有路由器,然后才会调用Backbone.history.start()。我意识到这个答案需要你潜入Marionette,它有一个陡峭的学习曲线,但我认为这是完全值得的。我们在其上构建了SOOMLA designer web-app的整个架构。当您想要重复使用重复的Backbone样板代码时,Marionette已被证明是一个很好的解决方案。感谢Derick Bailey获得了一个非常棒的开源框架。

答案 1 :(得分: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)访问您的Backbone视图。我会尽量做得更彻底(因为我仍然没有你问题的所有细节)。

This jsfiddle显示了原则。现在,仍然有一个事实,它会弄乱客户的历史(可能有一种方法可以避免在Backbone我认为,你必须调查,如果它是一个问题)。

现在,可能还有其他一些问题。其中最少的可能是辅助路由器中的样板(您必须在任何路由之前放置 view / )。有解决方案,但这将太深入。更大的是以下内容:
我已经说过但只有一条路线可以匹配。因此,您的主路由器CANT用于处理客户端将更改视图的事实(例如从 view1 / action1 view2 / action2 ,之前已经加载了router2)。 action2将被执行,但如果您在主路由器中重新加载了视图,则无法完成 就像最后一条评论一样,您可以在创建主路由器后修改路由器核心初始化方法以添加样板行为(重新加载您的视图?):here's an example可能适合您。