防止用户导航到某个路由URL

时间:2013-05-11 21:18:56

标签: url-routing durandal

我的SPA顶部有一些主导航按钮。在内容区域的下方,每个主按钮都有一些按钮。在这些内容按钮上加载一个包含3个视图的向导。这意味着用户首先导航到view1单击下一个按钮以导航到view2,然后在所有验证成功后导航到view3。

现在,当我为所有viewModel / views设置一条路线时,用户可以直接导航到view3,这会绕过我的验证。

也许你现在说,我不应该为这些观点创建一条路线,但是我无法导航到它们......

那么如何为view2和view3设置一条不应直接暴露给用户的路由,但如果view1绕过了验证,我需要能够导航到它们吗?

我找到了关于durandaljs的信息并阻止导航到某个网址:

·在路由器上增加了一个guardRoute挂钩,允许根据路由允许,拒绝或重定向。

但我不知道如何在我自己的viewmodels中使用guardRoute ......

1 个答案:

答案 0 :(得分:2)

Durandal's newsgroup前一段时间有一个问题接近这个问题。

简而言之,不使用路由器功能,而是使用ViewModel.activator()在这些步骤之间切换。这样您就可以完全控制,根据向导虚拟机的状态可以访问哪些步骤。

以上是Rob的推荐:

  

撰写,撰写,撰写。 :)如果我正在建立一个向导,这里是   我会做什么:

     
      
  1. 创建一个管理当前页面并转换下一个/后退的模块。为它创建一个使用compose引入的视图   当前页面
  2.   
  3. 为向导的每个步骤创建一个模块,该模块具有唯一的字段和验证。
  4.   
  5. 为每个模块步骤创建一个视图。
  6.         

    这就是它的全部。像这样:

更新示例:

实时版:http://dfiddle.github.io/dFiddle-1.2/#/view-composition/wizard

define(['durandal/viewModel', './step1', './step2', './step3'], function( viewModel, Step1, Step2, Step3 ) {

    var steps = [new Step1(), new Step2(), new Step3()];
    var step = ko.observable(0);
    var activeStep = viewModel.activator();
    var stepsLength = steps.length;

    var hasPrevious = ko.computed(function() {
        return step() > 0;
    });

    var hasNext = ko.computed(function() {
        return (step() < stepsLength - 1);
    });

    // Start with first step
    activeStep(steps[step()]);

    return {
        showCodeUrl: true,
        steps: steps,
        step: step,
        activeStep: activeStep,
        next: next,
        previous: previous,
        hasPrevious: hasPrevious,
        hasNext: hasNext
    };

    function next () {
        if ( step() < stepsLength ) {
            step(step() + 1);
            activeStep(steps[step()]);
        }
    }

    function previous () {
        if ( step() > 0 ) {
            step(step() - 1);
            activeStep(steps[step()]);
        }
    }

});

查看整个帖子以获取更多信息。