41

我希望有一个'catch all' 路由,该路由在没有其他定义的路由匹配时运行。一种 404 NotFound 错误处理程序。

我试过添加这个,它可以工作,但会阻止其他路由匹配:

this.route(/(.*)/, 'notFound', this.notFound);

以前有人解决过这个问题吗?

4

7 回答 7

83

为了完整起见,在这里回答。

你可以通过两种方式做到这一点。使用 定义正则表达式route(),如问题中所示。但是,由于这个错误,您需要通过该route()方法定义所有路由,并且以相反的顺序(顶部的总括)。这会阻止您使用路由哈希,因此(我的)首选方法是:

routes: {
  'users/search': 'searchUsers',
  'users/:id': 'loadUser',

  '*notFound': 'notFound'
}

'*notFound'实际上可以是任何以*. 您只需要在 之后的字符*来防止解析错误。

于 2012-06-28T02:17:47.353 回答
20

还有另一种可以说更简单/更优雅的方法来解决这个问题。 Backbone.History.start()根据是否匹配路由返回真或假。所以,如果你这样做:

if (!Backbone.history.start()) router.navigate('404', {trigger:true});

而不是通常的:

Backbone.History.start();

它将与其他答案具有相同的效果。

于 2013-08-13T21:16:35.053 回答
2

这个非常小的插件完成了它的工作:https ://github.com/STRML/backbone.routeNotFound

这是迄今为止我发现的解决此问题的最优雅和最强大的方法,但是请记住,使用它会弄乱 Backbone 的内部结构。

于 2015-07-02T19:09:24.913 回答
1

如果没有您当前路由代码的示例,我会假设确保您的全部路线是最后一条路线应该适合您

于 2012-06-28T00:04:06.927 回答
0

只需将其添加为列表中的最后一条路线即可。这样它只会被匹配为后备选项。

于 2012-06-27T23:59:24.667 回答
0

您可以像这样将其破解到主干:

var _loadUrl = Backbone.history.loadUrl;
Backbone.history.loadUrl = function (fragment) {
    var result = _loadUrl.apply(Backbone.history, fragment);
    // the loadUrl returns false if no route was found.
    if(!result){
        // call 404 route on router if it exists.
        var handler = Backbone.history.handlers.filter( o => o.route.test("404") )
        if(handler.length) {
            Backbone.history.navigate("/404")

        }
    }
}

然后在您的路由器中,您可以这样做:

var Router = Backbone.Router.extend({
    routes: {
        "404": "pageNotFound"
    },

    pageNotFound: function () {
        alert("trigger pageNotFound route")
    }
});
于 2018-06-07T21:20:21.883 回答
-18

我觉得这个不应该通过javascript来解决,应该是语言来解决,比如php。在服务器端处理文字,只要有条件就可以响应header错误号404

于 2012-06-28T00:02:03.513 回答