我有以下内容:
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很糟糕。
答案 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");
}