【问题标题】:Durandal - how to "protect" a route?Durandal - 如何“保护”路线?
【发布时间】:2013-12-25 03:53:43
【问题描述】:

在我的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 处完全退出虚拟机(并防止任何进一步执行),或者以某种方式保护路由甚至不加载虚拟机?

【问题讨论】:

    标签: single-page-application durandal


    【解决方案1】:

    您应该查看router.guardRoute,如http://durandaljs.com/documentation/Router/ 所述。 确保您正在运行 Durandal 1.2 router.guardRoute is not being called

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

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

    【讨论】:

    • 再次感谢 Rainer 的帮助(你今天救了我)。我确实在文档中看到了这一点,但找不到它的用法示例(除了日志记录,来自第二个链接)。您介意发布一个条件路由的示例吗?
    • 对不起,我没有可用的示例,但它应该很容易实现。如果您遇到问题,请随时根据github.com/dFiddle/dFiddle-1.2 提出一个小提琴,我会看看。
    • 您的 durandaljs 链接已损坏。
    【解决方案2】:

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

    vm = { 可以停用:功能(数据){ 如果(!data.foo)返回false; } }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多