Durandal中的条件路由

时间:2013-10-01 14:57:44

标签: durandal single-page-application hottowel durandal-navigation

在我基于HotTowel的项目中,我正在使用Durandal 1.1.1进行路由。

我有一个登录路由,如果用户没有登录,我想激活它。

我的路线配置如下:

var routes = [ {
    url: 'login',
    moduleId: 'viewmodels/login',
    name: 'Login',
    visible: true,
    caption: 'Login'
    },{
    url: 'moduledetail/:id',
    moduleId: 'viewmodels/moduledetail',
    name: 'ModuleDetail',
    visible: true,
    caption: 'ModuleDetail'
    }

我希望如果用户想要#/moduledetail/1并且尚未通过身份验证,则浏览器会导航到路由#/login/moduledetail/1,以便在成功登录后返回#/moduledetail/1

一种可能的解决方案是将navigateTo放在canActivate moduledetail中,如:

function canActivate()
{
    if (!loggedIn)
        router.navigateTo(`#/login/moduledetail/1`)
    return false;
}

但在canActivate期间导航到另一个页面似乎太愚蠢了。

有没有方法告诉Durandal在路由时,在这种情况下使用这条路线?

1 个答案:

答案 0 :(得分:6)

在Durandal 2.0中,这是使用router.guardRoute:

实现的
auth = require('auth');
router.guardRoute = function(model, route) {
    return auth.loggedIn() || '#/login';
};

从我读过的内容来看,虽然没有记载,但这种行为在Durandal 1.x中也是如此。 Guard路由是在加载viewModel之后但在视图模型上调用activate之前调用的函数。如果为true,则路由继续。如果是字符串,路由器会尝试导航到与该字符串关联的路由。