Durandal:如何在该视图的activate()函数中远离当前视图?

时间:2013-06-27 01:27:08

标签: single-page-application durandal

我有以下内容:

function activate(routeData) {
    // make dataservice call, evaluate results here.  If condition is met, reroute:
    if (true){
       router.navigateTo("#/someRoute");
     }
    alert ("should not be shown");
}

然而,警报被点击,然后视图发生了变化。

如何完全离开当前项目并阻止该vm中的任何其他代码被命中?

更新:

我尝试使用guardroute但我必须激活viewModel来调用dataservice,它返回确定我是否应该重新路由的数据。使用guardroute完全阻止了数据服务被调用(因为激活函数中的任何内容都不会被命中)。

我也尝试从if块返回,但这仍然会加载view / viewAttached / etc,因此UX很糟糕。

5 个答案:

答案 0 :(得分:12)

以下在Durandal 2.0中为我工作:

    canActivate: function() {
        if(condition)
            return {redirect: 'otherRoute'};
        return true;
    }

    activate: // Do your stuff

文档中提到了http://durandaljs.com/documentation/Using-The-Router.html

答案 1 :(得分:3)

您无法将重定向调用到活动方法中。

您可以从路由器覆盖guardRoute方法,以实现重定向。

你可以这样做:

router.guardRoute= function(routeInfo, params, instance){
  if(someConditios){
    return '#/someRoute'
  }
}

您可以返回承诺,true,false,重定向路线...您可以在下一个链接中找到有关该承诺的更多信息:http://durandaljs.com/documentation/Router/

答案 2 :(得分:3)

@EisenbergEffect回答了google groups中非常类似的讨论。

  

在您的视图模型上实施canActivate。回报虚假的承诺,   然后用重定向链。

你可能想在@Danndal 1.2中试试@ JosepfGabriel的例子(discussion)。检查Durandal版本的正确router语法,您可能必须使用router.navigateTo("#/YourHash", 'replace')之类的内容替换它。

canActivate: function () {
    return system.defer(function (dfd) {
        //if step 2 has a problem
        dfd.resolve(false);
    })
    .promise()
    .then(function () { router.navigate("wizard/step1", { trigger: true, replace: true }); });
}

但是,这不适用于Durandal 2.0,并且有功能请求https://github.com/BlueSpire/Durandal/issues/203

答案 3 :(得分:1)

Rainer的回答非常好,并且可以帮我添加这个小修补程序。

在then()块中,只需像这样调用导航

setTimeout(function() { router.navigateTo('#/YOUR DESTINATION'); }, 200);

应该解决你的问题。 setTimeout可以解决这个问题。没有它,新导航的页面将捕获前一个的旧版NavigationCancel。

答案 4 :(得分:0)

在if(true)块中添加一个返回应修复此问题。

function activate(routeData) {
    if (true){
       router.navigateTo("#/someRoute");
       return;
     }
    alert ("should not be shown");
}