具有计算可观察量的KnockoutJS可观察数组

时间:2015-09-02 10:15:20

标签: javascript knockout.js

我有一个JSON数组,两个列表(由计算的observable填充)和一个选定项目数组(JSON数组中的项目ID)。

所选项目保存在observableArray中,我想要一个列表填充数组中的项目,另一个列表将由数组中的所有项目填充。

这适用于初始化,但如果我尝试将项目添加到所选项目数组,则更改不会反映在UI或两个列表数组中。

https://jsfiddle.net/mnbu21z4/3/

var witnessJSON = [
    {"id":3,"name":"Bob3"},
    {"id":2,"name":"Bob2"},
    {"id":1,"name":"Bob1"}
];

var viewModel = function() {
  self = this;

  self.witnessArray = ko.observableArray([1]);

  self.witnessesAdded = ko.computed(function() {
    return ko.utils.arrayFilter(witnessJSON, function(witness) {
      return self.witnessArray().indexOf(witness.id) > -1;
    });
  });

  self.witnessesPool = ko.computed(function() {
    return ko.utils.arrayFilter(witnessJSON, function(witness) {
      return self.witnessArray().indexOf(witness.id) == -1;
    });
  });
}

myViewModel = new viewModel();
ko.applyBindings(myViewModel);

viewModel.witnessArray.push(2);

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您的示例中似乎已经拼错了myViewModel

改变这个:

myViewModel = new viewModel();
ko.applyBindings(myViewModel);

viewModel.witnessArray.push(2);

对此:

var myViewModel = new viewModel();
ko.applyBindings(myViewModel);

myViewModel.witnessArray.push(2);

然后你的小提琴例子将起作用。我已做出这些更改并更新了您的fiddle,它确实有效。

您可能希望查看淘汰赛投影插件,它可以让您以更有效的方式实现同​​样的目标。看一下这个SO answer