【问题标题】:Backbone routing, multiple routers after backbone.history starts骨干路由,backbone.history 启动后的多个路由器
【发布时间】:2013-03-28 01:31:49
【问题描述】:

所以我有点问题。

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

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

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

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

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

编辑:

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

【问题讨论】:

  • 如果您需要一种动态的方式来处理路由并且您的主路由器将确定这些动态路由是如何生成的,为什么不创建一个用于您的正则表达式和回调函数的 Backbone 集合第二个路由并将 url、正则表达式和回调函数传递给主路由器内的方法。这通常是处理路线的方式。只有一种方法,我相信还有更好的方法来做到这一点。
  • 嗯,这可能行得通,你有什么方法细节吗?

标签: javascript backbone.js backbone-routing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您能否提供一个 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)访问您的主干视图,这是一个编辑。我会尽量做到更彻底(因为我仍然没有你问题的所有细节)。

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

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

    【讨论】:

    • gist.github.com/amchang/5264260,你明白了主要思想,理想情况下,在这种情况下,我希望 router2 路由运行,即使它不是在历史开始时从技术上创建的。
    • 所以你最后的建议是说特殊情况,等待“异步”事件然后手动导航?
    • 那是我的一些代码,我担心'async'事件是我添加的(现在在家我无法查看它,我明天会检查)。但想法是听一些东西,告诉你可以再次导航,因为一切都已加载(这里是你的第二个路由器)。
    • 我写了一个对原问题的更新,也许你可以给出不同的方法
    • 您能否提供更多详细信息?据我了解:您有一个主路由器,它将路由到您的一个视图(我猜您的视图等效于服务器端 MVC 视图,即或多或少不同的页面)。从那时起,您希望每个视图都有一个路由器,因此您的辅助路由器仅在真正需要时才被实例化。当然,如果用户直接来到您的辅助路线之一(创建视图 + 执行其中的操作),它应该可以工作。是这样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多