My View Model有一个可观察的WizardSteps对象数组,
var steps = [
new WizardStep(1, "step1", viewModel1),
new WizardStep(2, "step2", viewModel2),
];
self.stepModels = ko.observableArray(steps)
WizardStep只有一个id,name和personViewModel。 viewModel1,viewModel2是两个包含姓名,年龄和电话号码的PersonViewModel。
我可以通过索引$root.stepModels()[0].viewModel.name
访问stepModels并获取viewModel1的名称。但我需要通过步骤名称访问它,例如,步骤1'。
我该怎么做?
答案 0 :(得分:1)
您可以使用"过滤器"数组函数:
var foundModel = <container object>.stepModels().filter(function(model) { return model.name === "modelName"; })[0];
if(!!foundModel) {
// some code working with found model
}
最好在模型中保存这样的函数,而不是将计算放入html标记。
答案 1 :(得分:1)
如果您需要经常访问模型,创建使用步骤值作为键的对象可能更容易,更快:
var WizardStep = function(id, name) {
this.id = id;
this.name = name;
};
var steps = [
new WizardStep(1, "step1"),
new WizardStep(2, "step2"),
];
var stepsByName = steps.reduce(function(result, step) {
result[step.name] = step;
return result;
}, {});
// The object:
console.log(JSON.stringify(stepsByName, null, 2));
// Get a step by name:
console.log(stepsByName["step1"]);
答案 2 :(得分:1)
我必须创建一个&#39;向导&#39;使用淘汰赛的类型功能前一段时间。你可以这样做:
var steps = ko.observableArray([
{ stepName: "step1", person: viewModel1 },
{ stepName: "step1", person: viewModel2 }
]);
首先,值得注意的是,如果您在填充后不再修改它,则您的步骤数组不必是可观察的。其次,您也可能不需要步骤编号 - 我认为这是1代表的行:
new WizardStep(1, "step1")
由于数组是有序的,因此您需要存储已有的信息,这些信息包含在步骤数组中每个元素的索引中。即步骤[0]将是步骤1,依此类推。如果你需要跟踪你在向导中的位置,你可以在viewModel中创建一个observable,并设置一个函数来设置你当前所处的步骤:
var self = this;
self.currentStep = ko.observable(0); // starting step
self.goToStep = function(index){
self.currentStep(index);
};
或者你可以:
var self = this;
self.currentStep = ko.observable(steps()[0]); // starting step
self.goToStep = function(index){
self.currentStep(steps()[index]);
// if you only need the viewModel associated with this step you could use:
self.currentPerson(steps()[index].viewModel.name);
};
在您的视图中,您可以使用敲除,如果绑定有条件地显示或隐藏您当前所在的步骤/简单地呈现self.currentStep()中保存的viewModel和数据绑定到click事件,例如。 / p>
如果您真的希望能够逐步访问stepName,那么您可以使用knockouts arrayFirst实用程序函数:
self.getStepByName = function(stepName){
return ko.utils.arrayFirst(steps(), function(step) {
return step.stepName() === stepName;
});
};
我会让你填写空白和遗失的声明。您也可以使用计算机或可写计算机执行某些操作。在一天结束时,有许多方法可以给猫皮肤。我确定这里提供的任何解决方案都是可行的。