如何处理/忽略与durandal的坏路线?

时间:2013-06-13 14:29:41

标签: single-page-application durandal

我正在尝试有条件地阻止访问路由。我认为这可以通过guardRoute来完成:http://durandaljs.com/documentation/Router/

  

function guardRoute(routeInfo, params, instance) : object - 在激活任何路由之前,调用guardRoute函数。您可以插入此功能以添加自定义逻辑,以根据请求的路径允许,拒绝或重定向。允许,返回true。否认,返回false。要重定向,请返回带有散列或URL的字符串。您也可以返回任何这些值的承诺。

我不知道如何指定应该访问哪条路由,或者如果我需要拒绝访问,如何重新路由到另一个视图。有人可以用这种方式发布它的使用示例吗?

2 个答案:

答案 0 :(得分:6)

在激活路由器之前,您应该使用guardRoute,例如在shell.js。 该示例来自Durandal 2.0 alpha站点。 AFAIK guardRoute没有从1.2改变,但是设置一个断点将允许你找出传递1.2的参数。 作为一般规则,请返回true以允许导航,false以阻止它,并hashurl值重定向。

define(['plugins/router'], function (router) {

    // Redirecting from / to first route in route.map
    router.guardRoute = function(routeInfo, params, instance){
        if (params.fragment === ''){
            return routeInfo.router.routes[0].hash;
        }
        return true;
    };
    ...    

    return {
        ...
        router: router,
        activate: function () {
            router.map([
               ---
            ]);

            return router.activate();
        }
    };
});

答案 1 :(得分:1)

我是durandaljs 2.0的新手,只用了几个星期,所以这是我的第一个绊脚石。看下面的代码

router.guardRoute = function (routeInfo, params, instance) {
    var insecureRoutes = ['login', 'terms','signup','password'];
    if ($.inArray(params.fragment, insecureRoutes) || mymodule.isAuthenticated()) {
        return true;
    } else {
        return 'login/' + params.fragment;
    }
};

我还为此登录页面定义了一条路线

{ route: 'login/(:returnroute)', moduleId: 'viewmodels/login', nav: false },

这允许您可选地指定返回路由,以便在登录后您可以将用户重定向到他们最初尝试去的地方。我希望它有助于某人