Durandal中的条件路由

meh*_*dvd 2 single-page-application durandal 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'
    }
Run Code Online (Sandbox Code Playgroud)

我想如果用户想去,#/moduledetail/1并且尚未经过身份验证,浏览器会导航到路由,#/login/moduledetail/1因此在成功登录路由后返回到#/moduledetail/1.

一个可能的解决方案是将一个navigateTocanActivatemoduledetail,如:

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

但导航到另一页canActivate似乎是如此愚蠢.

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

Mat*_*vis 6

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

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

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

  • 您在1.1.1中找不到它的原因,因为它是在1.2中添加的.https://github.com/BlueSpire/Durandal/blob/master/Changes.txt.是时候升级? (2认同)