在KnockoutJS中销毁元素后获取属性长度

时间:2016-06-09 18:41:02

标签: javascript jquery knockout.js

在KnockoutJS中,您可以拥有一个属性对象数组。例如。

self.items可以由以下项目组成:

var item = function (data){
  //mapping here
}

然后你可以通过调用类似的东西来“破坏”其中一个对象:

self.items.destroy(item);

但是如果我检查/绑定self.items的长度,它仍然是全长(包括被破坏的对象)。例如,在销毁东西后,这将无法正确更新,并保持可见:

data-bind="visible: myData.items().length > 0"

如何获取长度,减去被破坏的物体?

我想我可以创建一个computed kojsLength方法并将其添加到每个对象中,该对象遍历数组并计算所有没有_destroy属性的项目?

但是有内置的KOJS解决方案,还是我必须这样做?

编辑,我的解决方案:

对我来说,因为我没有使用后端的_destroy属性,直接替换remove函数destroy就完美了。

1 个答案:

答案 0 :(得分:1)

这是因为实际上没有从底层数组中删除被破坏的元素。它们只是标记为已销毁,正如您可以通过运行以下代码段看到的那样。

没有内置的KO解决方案。

如果要通过计算长度排除它们,则需要一个丢弃它们的自定义长度函数:



function viewModel(name) {
  this.name = name;
}

var array = ko.observableArray([new viewModel("a"), new viewModel("b")]);

console.log(array().length);
array.destroy(array()[0]);
console.log(array().length);
console.log(JSON.stringify(array()));

function lengthOfAlive(obs) {
  var before = obs().length;
  var res = before;
  for (var i = 0; i < before; ++i) {
    if (obs()[i]._destroy)
      res--;
  }
  return res;
}

console.log(lengthOfAlive(array));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
&#13;
&#13;
&#13;