前几天我问了一个问题(here)。有人回答说,他们的回答符合我的意图。但是,有一些我不理解的代码,我希望有人可以帮助我。
self.currentlySelected = ko.computed(function() {
return self.topics().reduce(function(count, topic) {
return count + (topic.selected() ? 1 : 0);
}, 0);
});
有人会善意地解释这个功能在做什么吗?谢谢!
答案 0 :(得分:2)
它表示currentlySelected
是一个计算属性 - 要查看它的值,你必须评估一个函数。
该功能说:
1. Get the topics
2. Reduce the topics down to a single value, using the following function
3. If the topic is selected, add 1 to our running total (count).
Otherwise, add 0. Our initial value for count is 0.
答案 1 :(得分:1)
它在您的主题列表中使用reduce方法,它遍历主题可观察数组中的每个项目,检查它是否被选中,然后添加所有这些项目。它看起来也像这样:
self.currentlySelected = ko.computed(function() {
var count = 0
for(var i = 0; i < self.topics().length; i++){
var topic = self.topics()[i]
if(topic.selected()){
count += 1;
}
}
return count
});
<。> .reduce方法是原生的Javascript方法,可以找到更多Here
.computed方法是knockout.js,很好地解释Here
答案 2 :(得分:1)
让我们从内到外
self.topics().reduce(/* code... */, 0)
- 这是在self.topics
中存储的数组上调用Array.prototype.reduce()。此函数适用于集合并将其缩减为单个值 - 在本例中为count + (topic.selected() ? 1 : 0)
,因此它返回所选主题的计数。最后一部分,即计数代码self.topics().reduce(/* code... */, 0)
之后的最后一个零,是计数的初始值。因此,它从零开始,计算每个选定的主题,返回结果。
ko.computed(function() { /* reduction code */ });
正在创建一个computed observable Knockout observable,如果其依赖的任何可观察对象发生变化,则会自动更改。在这种情况下,这是self.topics
- 对它们的任何更改(如添加/删除它们)都会导致self.currentlySelected
重新计算,因此它将始终显示...当前选定的项目。他们的数量更具体。