在我基于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在路由时,在这种情况下使用这条路线?
答案 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,则路由继续。如果是字符串,路由器会尝试导航到与该字符串关联的路由。