有没有办法用Backbone捕获所有不匹配的路由?

时间:2012-06-27 23:51:55

标签: javascript backbone.js router

我想要一个'catch all'路线,当没有其他定义的路线匹配时,它会运行。一种404 NotFound错误处理程序。

我已尝试添加此功能,但可以防止其他路由匹配:

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

之前有人解决了这个问题吗?

7 个答案:

答案 0 :(得分:81)

在此回答完整性。

你可以这两种方式做到这一点。使用route()定义正则表达式,如问题所示。但是,由于this bug,您需要通过route()方法定义所有路线,并按相反的顺序定义(顶部为catchall)。这可以防止您使用路由哈希,因此(我的)首选方法是:

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

  '*notFound': 'notFound'
}

密钥'*notFound'实际上可以是以*开头的任何内容。您只需在*之后需要字符以防止解析错误。

答案 1 :(得分:20)

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

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

而不是通常的:

Backbone.History.start();

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

答案 2 :(得分:2)

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

这是迄今为止我发现的解决这个问题的最优雅和最强大的方法,但请记住,通过使用它,你正在搞乱Backbone的内部。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分: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")
    }
});

答案 6 :(得分:-18)

我认为这不应该通过JavaScript来解决,应该是要解决的语言,例如php。在服务器端处理单词,只要你有条件就可以响应头部,错误号为404