Javascript 向主干.js路由器添加路由,包括404处理程序

Javascript 向主干.js路由器添加路由,包括404处理程序,javascript,backbone.js,backbone-routing,Javascript,Backbone.js,Backbone Routing,这个问题类似于解释如何通过编程添加路由的问题。这很好,但是我正在尝试添加一个全面的处理程序。当我这样做的时候,我得到了所有路线的404 Workspace = Backbone.Router.extend({ routes: { "help": "help", "search/:query/p:page": "search", }, help: function() { console.log("help"); }, search:

这个问题类似于解释如何通过编程添加路由的问题。这很好,但是我正在尝试添加一个全面的处理程序。当我这样做的时候,我得到了所有路线的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});

这是我的

,您可能已经注意到,
route()
函数会将一条路由添加到主干路由的开头,而不是结尾,这意味着您添加的每个新路由都会在您添加的最后一条路由之前进行检查。具体来说,当您调用
route()
时,它最终会调用
Backbone.History.route()
,其中:

因此,如果您动态地(通过函数)添加所有路由,或者在定义路由器时在
routes
对象中添加最后一个路由,那么实际上需要首先添加“全面覆盖”路由。这样做将允许主干网在到达您希望运行的“全面覆盖”路由之前检查每个路由是否匹配,前提是所有其他路由都不匹配

但这可能不是你想听的。如果在定义一组路由后确实要将此路由添加到末尾,则需要访问
主干内的
处理程序
数组。历史记录
新路由推送到末尾,而不是
取消移动
。您还需要复制主干已经完成的功能


不过,这可能并不推荐,因为您将访问主干网的内部功能,将来可能会发生变化。您可以尝试向主干代码库添加一个功能请求,或者自己执行并发出一个请求。

这很好。我相信我读到的其他东西表明,这些路线只是附加在主干线历史上的。
route: function(route, callback) {
  this.handlers.unshift({route: route, callback: callback});
},