【问题标题】:Adding routes to Backbone.js Router including 404 handler向 Backbone.js 路由器添加路由,包括 404 处理程序
【发布时间】:2014-06-20 13:47:45
【问题描述】:

这个问题类似于9595182,它解释了如何以编程方式添加路由。这很棒,但是我正在尝试添加一个捕获所有处理程序。当我这样做时,我会得到所有路线的 404。

Workspace = Backbone.Router.extend({

  routes: {
    "help": "help",
    "search/:query/p:page": "search",
  },

  help: function() {
    console.log("help");       
  },

  search: function(query, page) {
    console.log("search",query,page);
  }

});

app = new Workspace();
Backbone.history.start();

//This works
app.route("page/:number", "page", function(number){
    console.log("page called! " + number);
});

//This returns a 404 for everything
app.route("*notFound", "page", function(){
    console.log("404 error");
});

app.navigate('page/4',{trigger:true});
app.navigate('page/3',{trigger:true});
app.navigate('oohh404',{trigger:true});

这是我的jsfiddle

【问题讨论】:

    标签: javascript backbone.js backbone-routing


    【解决方案1】:

    您可能已经注意到,route() 函数将路由添加到 Backbone 路由的开头,而不是结尾,这意味着您添加的每条新路由都将在您添加的最后一条之前检查。具体来说,当您调用 route() 时,它最终会调用 Backbone.History.route() which adds the route to the beginning of it's handlers array

    route: function(route, callback) {
      this.handlers.unshift({route: route, callback: callback});
    },
    

    因此,如果您动态地(通过函数)添加所有路由,或者在定义路由器时最后添加到routes 对象中,则需要首先添加“全部”路由。这样做可以让 Backbone 在到达“catch all”路由之前检查每条路由是否匹配,只有在所有其他路由不匹配时才会运行。

    但这可能不是你想听到的。如果您真的想在定义一组路由后将此路由添加到末尾,则需要访问Backbone.History 中的handlers 数组,而不是push 一个新路由到结束而不是unshifting 到数组的前面。您还需要复制 Backbone 已完成的功能in their route() function for Backbone.Router

    但可能不建议这样做,因为您将访问 Backbone 的内部功能,这可能会在未来发生变化。您可以尝试向 Backbone 代码库添加功能请求,或者自己完成并发出拉取请求。

    【讨论】:

    • 这很棒。我确信我读到的其他内容表明这些路由只是附加到 Backbone.History。
    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多