我的SPA顶部有一些主导航按钮。在内容区域的下方,每个主按钮都有一些按钮。在这些内容按钮上加载一个包含3个视图的向导。这意味着用户首先导航到view1单击下一个按钮以导航到view2,然后在所有验证成功后导航到view3。
现在,当我为所有viewModel / views设置一条路线时,用户可以直接导航到view3,这会绕过我的验证。
也许你现在说,我不应该为这些观点创建一条路线,但是我无法导航到它们......
那么如何为view2和view3设置一条不应直接暴露给用户的路由,但如果view1绕过了验证,我需要能够导航到它们吗?
我找到了关于durandaljs的信息并阻止导航到某个网址:
·在路由器上增加了一个guardRoute挂钩,允许根据路由允许,拒绝或重定向。
但我不知道如何在我自己的viewmodels中使用guardRoute ......
答案 0 :(得分:2)
在Durandal's newsgroup前一段时间有一个问题接近这个问题。
简而言之,不使用路由器功能,而是使用ViewModel.activator()在这些步骤之间切换。这样您就可以完全控制,根据向导虚拟机的状态可以访问哪些步骤。
以上是Rob的推荐:
撰写,撰写,撰写。 :)如果我正在建立一个向导,这里是 我会做什么:
- 创建一个管理当前页面并转换下一个/后退的模块。为它创建一个使用compose引入的视图 当前页面
- 为向导的每个步骤创建一个模块,该模块具有唯一的字段和验证。
- 为每个模块步骤创建一个视图。
醇>这就是它的全部。像这样:
实时版: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()]);
}
}
});
查看整个帖子以获取更多信息。