不久前, Durandal 的新闻组上有一个与此问题相关的问题。
简而言之,不要使用路由器功能,而是使用 ViewModel.activator() 在这些步骤之间切换。这样您就可以完全控制,根据向导 VM 的状态可以访问哪些步骤。
这是 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()]);
}
}
});
查看整个线程以获取更多信息。