【问题标题】:Default route in Backbone using routes property使用 routes 属性在 Backbone 中的默认路由
【发布时间】:2014-09-22 06:42:36
【问题描述】:

我正在处理一个 Backbone 项目,在我们的路由器中,我们在 routes 属性的末尾指定了一个默认路由:

routes: {
    "things": "stuff",
    "*actions": "default"
}

通过一些搜索,我看到了几个地方,例如this StackOverflow answerBackbone tutorial,它们建议以这种方式添加默认路由。

但是,这让我深感担忧,因为从我在Backbone source 中可以看到,routes 属性只是简单地迭代以添加其中的所有路由,据我所知,对象迭代JavaScript 不保证任何顺序。因此,使用上述routes 定义,并不能保证默认路由仅因为位于定义的末尾而具有最低优先级。

这里的行为本质上是未定义的,事情实际上只是纯粹的运气问题,还是有其他事情发生,实际上使这成为安全的事情?

【问题讨论】:

    标签: javascript backbone.js backbone-routing


    【解决方案1】:

    正如您所确定的,从route 属性派生的路由没有保证顺序......尽管实际上许多浏览器会按照定义的顺序遍历它们,您也可以通过使用 route 方法来保证顺序。

    但是你链接的那两个例子呢?好吧,如果你仔细观察它们,你会发现它们没有与你一样的任何其他路线。 splat 语法的存在只是为了提供一种更易读的方式来编写“任何不是问号的东西”(即([^?]*?));它实际上并不意味着成为默认处理程序。

    所以,如果你想要实现的是:

    if (url == 'things') {
        doStuff();
    } else {
        doActions();
    }
    

    你有两个选择。如果你愿意改变你的 url 结构,你可以简单地拥有:

    /things
    /actions/*actions
    

    如果你不是,你只需要定义一个区分的路线:

    routes: {':rootLevelPath': rootLevelPathRoute},
    rootLevelPathRoute: function(rootLevelPath) {
        if (rootLevelPath == 'things') {
            doThings();
        } else {
            doActions();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多