如何对 ko observable 的值求和

How to sum the values of a ko observable

更新一个非常旧的应用程序。 Rails 3.22.xx -> 4.2.xx

此代码用于工作

ko.observable(ko.utils.arrayMap(@posts(), (page) -> page.unread_count()).sum())

它会 return 总数,例如 15

升级到Rails4.2后returns

Uncaught TypeError: ko.utils.arrayMap(...).sum is not a function

我不确定如何得到这个,所以我可以 return 该值的总和。如果我删除总和,它 return 是所有值的数组,类似于 1,0,0,0,10,0,20。似乎我需要这个值来求和,因为它是作为一种方法从视图中调用的,所以如果我只是添加一个 for 循环并将所有这些相加然后分配给变量,视图仍然会中断。

你真的不需要再使用 knockout utils,所有浏览器都实现了 Array.prototype.map:

ko.observable(@posts().map((page) -> page.unread_count()).reduce((x, y) -> x + y, 0)))

或者简单地说javascript

ko.observable(this.posts().map(function(page) {
  return page.unread_count()
}).reduce(function(x, y) {
  return x + y
}, 0)))

我对 rails 一无所知,所以不确定为什么它在更新时崩溃了...但我知道 sum 不是 javascript 中的默认数组方法.

我建议您尝试将其替换为 reduce:

[1,0,0,0,10,0,20].reduce((a, b) => a + b, 0) // returns 31

你也可以像这样求和跳过map操作:

posts().reduce(
  (total, post) => total + post.unread_count(),
  0
)