1

在 can.js 中定义处理 404 的全部路由的正确方法是什么,以便首先检查所有正确的路由?如果不匹配,这条路线将捕获它,我可以显示 404 消息。

4

2 回答 2

0

这些只是我深入研究源代码并进行一些测试所学到的一些东西......

如果我用单个参数定义了一个根,例如 can.route(":section") 并在地址栏中输入一个看起来像 "!#toronto/something/feasf" 的片段并且没有其他路由匹配它,目前可以将其视为上述路线并将其转换为“!#toronto%23something%23else”,根据为该路线生成的测试是正确的。

防止这种行为的方法是使用尾部斜杠定义路由, can.route(":section/") 在针对错误路由进行测试时,应将其重写为第一个匹配项“toronto”。如果您在控件中定义路由,这同样适用。

您必须在路由处理程序中捕获无效参数,或者如果将其提供给模型,则可以在回调中处理错误。但我认为从一开始就很清楚。

如果您出于某种原因仍想捕获不正确的路线,我已经进行了以下测试以捕获无效路线。我不建议这样做,因为它确实会在您的应用程序中产生不必要的开销。

can.route.bind('change', function(ev, newVal) {
    if (newVal === 'route') {
        var valid = false;
        $.each(can.route.routes, function(k,v) {
            if (new RegExp(v.test).test(window.location.hash)){
                valid = true;
                return; //exit loop
            }
        })

        if (!valid) {
            //handle the false route here
        }
    }
});
于 2012-12-14T17:55:24.160 回答
0

您可以在所有路线之后注册通配符

// Catch 404
router.register('.*', 'controller#action');
于 2015-06-25T00:37:27.543 回答