1

所以我有点问题。

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

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

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

有什么可能的方法可以让 router2 查看当前的历史片段,而无需再次调用 router1 中的路由?

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

编辑:

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

4

2 回答 2

2

我建议您尝试查看MarionetteJS,它是使用 Backbone 构建复合应用程序的绝佳框架。具体看MarionetteJS 示例应用的源码。它所做的是将应用程序分成几个子应用程序。每个子应用都有自己的路由器,但它们都在父应用上定义了单独的路由器。当父应用初始化时,所有路由器都被创建,然后才被Backbone.history.start()调用。我意识到这个答案需要你深入了解 Marionette,它的学习曲线很陡峭,但我认为这完全值得。我们已经构建了SOOMLA 设计器网络应用程序的整个架构在它的上面。当您想要超越重复的 Backbone 样板代码时,Marionette 已被证明是一个很好的解决方案。感谢Derick Bailey提供了一个很棒的开源框架。

于 2013-04-18T10:12:42.283 回答
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});
});

如果您有足够通用的 URL,则可以将 tab1 & stuff 替换为您将与通用路由匹配的参数。

编辑 2:
好的,这是一个编辑,假设我在上一条评论中写了所有内容,并且您使用主题标签(或 URL)访问您的主干视图,例如视图/操作。我会尽量做到更彻底(因为我仍然没有你问题的所有细节)。

这个jsfiddle显示了原理。现在,它仍然会与客户的历史记录混淆(我认为在 Backbone 中可能有一种方法可以避免这种情况,如果这对你来说是个问题,你必须调查一下)。

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

于 2013-03-28T13:12:55.543 回答