有没有办法赶上与骨干所有非匹配的路由?(Is there a way to catch all no

2019-06-25 20:20发布

我想有,当没有其他定义路由的匹配运行的“所有”的路线。 A型404 NOTFOUND错误处理程序的。

我试着加入这一点,这工作,但防止匹配其他路线:

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

任何人之前解决这个问题?

Answer 1:

回答是为了完整性。

你可以这样做2种方式。 定义正则表达式使用route()如在问题。 然而,由于这个错误 ,你需要通过定义的所有路由route()方法,并以相反的顺序(顶部包罗万象)。 这可以防止使用的路由散列,所以(我)优选的方法是:

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

  '*notFound': 'notFound'
}

关键'*notFound'实际上可以是任何东西,开始* 。 你只需要字符后, *防止解析错误。



Answer 2:

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

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

而不是通常的:

Backbone.History.start();

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



Answer 3:

这非常小的插件得到顺利完成任务: https://github.com/STRML/backbone.routeNotFound

这是解决这一问题的最优雅,最可靠的方法,我发现到目前为止,但是请记住,通过使用它,你与骨干网的内部搞乱。



Answer 4:

如果没有当前的路由代码,我会假设你确保捕获的示例中,所有的路线是最后的路线应该为你工作



Answer 5:

只需将它添加在列表中的最后途径。 这样只会匹配的后备选项。



Answer 6:

您可以以这样的骨干本事:

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")
    }
});


Answer 7:

我想这应该不是通过JavaScript来解决,应该是解决语言,例如PHP。 在词的服务器端处理,只要你具备的条件,你可以用错误编号404的响应头



文章来源: Is there a way to catch all non-matched routes with Backbone?