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

Adding routes to Backbone.js Router including 404 handler

本文关键字:包括 处理 程序 路由 Backbone js 路由器 添加      更新时间:2023-09-26

这个问题类似于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});

这是我的jsfield

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

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

所以如果你动态添加所有的路由(通过函数),一个"捕获所有"的路由需要首先添加,或者当你定义路由器时,最后在routes对象中添加。这样做将允许Backbone在到达"捕获所有"路由之前检查每个路由是否匹配,只有当所有其他路由都不匹配时才运行。

但这可能不是你想听到的。如果您真的想要在定义一组路由后将此路由添加到末尾,则需要访问Backbone.History中的handlers数组,以代替push到末尾的新路由,而不是unshift将其添加到数组的前面。你还需要复制Backbone在其route()函数中为Backbone. router .

所做的功能。

可能不建议这样做,因为您将访问Backbone的内部函数,这些函数将来可能会更改。您可以尝试向主干代码库添加一个特性请求,或者自己做,并发出一个pull请求。