2

在我的基于 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类似canActivatemoduledetail

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

但是在此期间导航到另一个页面canActivate似乎很愚蠢。

有什么方法可以告诉 Durandal 在路由时,在这种情况下使用这条路由?

4

1 回答 1

6

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

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

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

于 2013-10-01T15:26:05.417 回答