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

4ngedf3f  于 2022-11-10  发布在  其他
关注(0)|答案(7)|浏览(149)

我想有一个“捕获所有”路由,当没有其他已定义的路由匹配时运行。一个404 NotFound错误处理程序类型。
我试过添加以下内容,它可以工作,但会阻止其他路由匹配:

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

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

zc0qhyus

zc0qhyus1#

在此回答是为了完整性。
你可以用两种方法来定义正则表达式。使用route()来定义正则表达式,如问题所示。但是,由于this bug,你需要通过route()方法来定义所有的路由,并且顺序相反(catchall在顶部)。这会阻止你使用路由哈希,所以(我)首选的方法是:

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

  '*notFound': 'notFound'
}

关键字'*notFound'实际上可以是以*开头的任何字符,您只需要在*后面加上字符以防止解析错误。

ckx4rj1h

ckx4rj1h2#

还有另一种更简单/更优雅的方法来解决这个问题。Backbone.History.start()根据它是否匹配一个路由返回true或false。

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

而不是通常的:

Backbone.History.start();

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

3qpi33ja

3qpi33ja3#

这个非常小的插件完成了它的工作:https://github.com/STRML/backbone.routeNotFound
这是迄今为止我发现的解决这个问题的最优雅和最健壮的方法,但是请记住,使用它,你是在扰乱 Backbone 网的内部。

7xllpg7q

7xllpg7q4#

如果没有您当前路由代码的示例,我会假设确保您的“全部捕获”路由是最后一条路由应该对您有效

vh0rcniy

vh0rcniy5#

只需将其添加为列表中的最后一个路由。这样,它将仅作为备用选项匹配。

erhoui1w

erhoui1w6#

你可以像这样把它插入 Backbone.js :

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

8i9zcol27#

我觉得这个不应该通过JavaScript来解决,应该是语言来解决,比如说php.在服务器端处理的话,只要你有条件你就可以用错误号404来响应head

相关问题