我的viewmodel中有一个函数循环遍历数组并查看 对于具有相似ID的项目(我知道它是错误的,因为ids是唯一的,当我解决此问题时会将其更改为某些自定义数据属性)并检查它们是否找到。这是功能:
/*
Search for similar terms in taxonomy,
if found check/uncheck them
*/
self.srcSimilar = function(tid,val){
_.filter(self.topics(), function(topic) {
return _.any(topic.children, function(member) {
tid === member.tid ? member.isSelected(val) : '';
return _.any(member.children, function(child) {
tid === child.tid ? child.isSelected(val) : '';
});
});
});
}
从现在开始,该函数已在child.is的.subscribe方法中被调用。选择了observable,如下所示:
child.isSelected.subscribe(function(val){
self.srcSimilar(child.tid,val);
});
现在我需要在计算的observable中转换child.isSelected observable,因为checked / unchecked状态取决于插入selectedItems可观察数组中的子节点。所以我将child.isSelected observable改为:
child.isSelected = ko.computed({
read: function(){
},
write: function(val){
self.srcSimilar(child.tid,val);
}
});
...但这最终导致控制台中出现“过多的递归”错误。 我在这里遗漏了一些东西,不明白为什么.subscribe有效,而ko.computed写入方法在一个递归中被卡住了。 谢谢你的帮助。
答案 0 :(得分:2)
传递给subscribe的函数仅在child.isSelected CHANGES时调用。这意味着如果self.srcSimilar在调用self.srcSimilar的同一个子节点上设置isSelected,则不会再次触发更改事件,因为该值已经设置且该方法不会递归。
然而,对于计算,只要设置了child.isSelected,就会调用为write定义的方法。
想象一个数据集,其中A类似于B.
使用Computed
订阅