从可观察数组中敲除访问对象值

时间:2016-06-27 03:36:03

标签: knockout.js knockout-3.0

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'。

我该怎么做?

3 个答案:

答案 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;
  });
};

我会让你填写空白和遗失的声明。您也可以使用计算机或可写计算机执行某些操作。在一天结束时,有许多方法可以给猫皮肤。我确定这里提供的任何解决方案都是可行的。