3

我有以下内容:

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 来调用返回数据的数据服务,以确定我是否应该重新路由。使用guardroute 完全可以防止调用数据服务(因为激活函数中的任何内容都不会受到影响)。

我也尝试从if块中返回,但这仍然会加载视图/viewAttached/等,因此用户体验会出现故障。

4

5 回答 5

14

以下在 Durandal 2.0 中为我工作:

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

    activate: // Do your stuff

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

于 2013-09-20T07:29:33.793 回答
3

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

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

你可以这样做:

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

你可以返回一个承诺,真,假,重定向的路线......你可以在下一个链接中找到更多信息:http: //durandaljs.com/documentation/Router/

于 2013-06-27T09:39:25.727 回答
3

这是@EisenbergEffect 对google groups中一个非常相似的讨论的回答。

在您的视图模型上实现 canActivate。返回一个 false 的承诺,然后用重定向链接。

您可能想在 Durandal 1.2 中尝试@JosepfGabriel 的示例(讨论)。检查您的 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

于 2013-06-28T08:02:09.927 回答
1

Rainer 的回答非常好,对我添加这个小修复很有用。

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

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

那应该可以解决您的问题。setTimeout 可以解决问题。没有它,新导航的页面会从前一个页面中捕获旧的 NavigationCancel。

于 2013-07-09T21:13:50.640 回答
0

在 if (true) 块中添加 return 应该可以解决此问题。

function activate(routeData) {
    if (true){
       router.navigateTo("#/someRoute");
       return;
     }
    alert ("should not be shown");
}
于 2013-06-27T12:46:27.957 回答