在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
就完美了。
答案 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;