knockout.js 如何对ko可观测值求和

tvokkenx  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(166)

更新一个非常旧的应用程序。Rails 3.22.xx -〉4.2.xx
此代码用于工作

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

它将返回总数的一个数字,类似于15
在升级到Rails 4.2之后,它返回

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

我不知道如何得到这个值,所以我可以只返回一个值的和,如果我去掉这个和,它会返回一个包含所有值的数组,类似于1,0,0,0,10,0,20,看起来我需要这个值来求和,因为它是作为一个方法从视图中调用的,所以如果我只添加一个for循环,把所有这些加起来,然后赋给变量,视图仍然会中断。

z5btuh9x

z5btuh9x1#

我对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
)
yi0zb3m4

yi0zb3m42#

你不需要再使用敲除工具了,所有的浏览器都实现了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)))

相关问题