【问题标题】:How to define a catch all route to handle 404 in can js?如何定义一个catch all路由来处理can js中的404?
【发布时间】:2012-12-11 16:45:58
【问题描述】:

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

【问题讨论】:

    标签: routes canjs canjs-routing


    【解决方案1】:

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

    如果我用单个参数定义了一个根,例如 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
            }
        }
    });
    

    【讨论】:

      【解决方案2】:

      你可以在所有路由之后注册一个通配符

      // Catch 404
      router.register('.*', 'controller#action');
      

      【讨论】:

        猜你喜欢
        • 2013-03-12
        • 2010-12-19
        • 2015-04-06
        • 1970-01-01
        • 2017-04-17
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多