如何在can js中定义一个catch来处理404的所有路由?

时间:2012-12-11 16:45:59

标签: routes canjs canjs-routing

在can.js中定义捕获所有路由来处理404的正确方法是什么,以便首先检查所有正确的路由?如果非匹配,则此路由将捕获它,并且我可以显示404消息。

2 个答案:

答案 0 :(得分:0)

这些只是我学到的潜入源头并进行一些测试......

如果我使用单个参数定义了一个根,例如can.route(“:section”)并在地址栏中输入一个看起来像“!#toronto / something / actsf”的片段而没有另一个匹配它的路线,目前可以将其视为上述路线并将其转换为“!#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
        }
    }
});

答案 1 :(得分:0)

您可以在所有路线

之后注册通配符
// Catch 404
router.register('.*', 'controller#action');