杜兰达尔 - 如何“保护”一条路线?

时间:2013-06-10 19:24:43

标签: single-page-application durandal

在我的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?

2 个答案:

答案 0 :(得分:1)

您应按照http://durandaljs.com/documentation/Router/中的说明调查router.guardRoute。 确保您正在运行Durandal 1.2 router.guardRoute is not being called

更新了Durandal 2.0的路由器链接。基于评论:

http://durandaljs.com/documentation/Using-The-Router/

答案 1 :(得分:0)

看起来,你可以使用canActivate钩子方法。在调用activate之前调用此方法。您可以停止从此方法返回false的转换。

  vm = {
     canDeactivate : function(data) {
       if (! data.foo) return false;
     }
  }