0

在我的shell.js中,我在 UI 中有一些选项,用户可以在导航到child.jsvm 之前选择这些选项。child.jsvm 需要提供此选项数据 。

如果我#/child直接导​​航到,目前我会收到一些错误,因为尚未提供此数据。这是预期的行为......虽然我想以某种方式保护 child.js 视图不被直接访问。

理想的情况是,如果用户在子视图上刷新页面或直接导航到它(可以通过检查所需的选项数据是否存在来捕获),我通过不同的路线将它们推送到另一个视图。如果所需的选项数据在那里,我应该只能访问子虚拟机。

我试过这样做:

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?

4

2 回答 2

1

您应该router.guardRoute按照http://durandaljs.com/documentation/Router/中的说明进行查看。确保您正在运行 Durandal 1.2 router.guardRoute 未被调用

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

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

于 2013-06-10T19:34:46.013 回答
0

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

  vm = {
     可以停用:功能(数据){
       如果(!data.foo)返回false;
     }
  }
于 2013-08-20T09:15:05.557 回答