在我的shell.js
中,我在UI中有一些选项,用户可以在导航到child.js
vm之前选择。 child.js
vm需要提供此选项数据。
如果我直接导航到#/child
,目前我收到一些错误,因为尚未提供此数据。这是预期的行为......虽然我想以某种方式保护child.js视图不被直接访问。
理想情况是,如果用户刷新子视图上的页面或直接导航到它(可以通过检查是否存在所需的选项数据来捕获),我会通过不同的路径将它们推送到另一个视图。如果有必要的选项数据,我应该只能访问子vm。
我试过这样做:
var vm = {
activate: activate
};
function activate() {
alert("ACTIVATED");
if (<check for data exists>) {
vm.data = ko.mapping.fromJS(<data>, mapping);
} else {
toastr.error("session data lost");
router.navigateTo("#/getdata");
}
};
return vm;
然而,当数据不存在时,我可以看到整个页面加载和activate
上面的代码在从router.navigateTo加载新视图之前运行。
如何在上面的router.navigateTo中完全退出vm(并防止任何进一步的执行),或以某种方式保护路由甚至在某些数据不可用时(首选)加载vm?
答案 0 :(得分:1)
您应按照http://durandaljs.com/documentation/Router/中的说明调查router.guardRoute
。
确保您正在运行Durandal 1.2 router.guardRoute is not being called
答案 1 :(得分:0)
看起来,你可以使用canActivate钩子方法。在调用activate之前调用此方法。您可以停止从此方法返回false的转换。
vm = { canDeactivate : function(data) { if (! data.foo) return false; } }