Обновление действительно старого приложения. Рельсы 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 и добавлю все это, а затем назначу переменную, представление все равно сломается.

0
Rockwell Rice 1 Фев 2022 в 01:00

2 ответа

Вам больше не нужно использовать утилиты нокаута, все браузеры реализуют Array.prototype.map:

ko.observable(@posts().map((page) -> page.unread_count()).sum()))

Или в простом JavaScript

ko.observable(this.posts().map(function(page) {
  return page.unread_count()}
).sum()))
0
rewritten 1 Фев 2022 в 03:59

Я ничего не знаю о рельсах, поэтому не уверен, почему он сломался при обновлении... но я знаю, что 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
)
0
user3297291 1 Фев 2022 в 15:16