Нокаут JS: Расчет среднего дохода NaN?

0

Задний план:

Я создаю свое первое веб-приложение, классную книгу. Я пытаюсь вычислить средний балл из наблюдаемого массива scores. Среднее, называемое mean является наблюдаемым объектом. И mean и scores принадлежат модели.

Я просто не знаю, в чем проблема. Я заметил, что при печати mean консоль, что напечатанное значение - NaN ИЛИ блок кода. Мой скрипт, а также консольные журналы можно увидеть здесь:

http://jsbin.com/fehoq/20/edit

Мне интересно, добавление числа к наблюдаемому не так прямолинейно, как я предполагаю, но я не уверен, каким будет правильный метод.

  • 1
    Будучи наблюдаемым, this.mean является функцией, а не переменной. Взгляните на документ: knockoutjs.com/documentation/observables.html
Теги:
knockout.js
ko.observablearray

1 ответ

0
Лучший ответ

При работе с наблюдаемыми и наблюдаемыми массивами убедитесь, что вы правильно их читаете и пишете...

В этом блоке кода...

this.scores = ko.observableArray([79, 89]);
this.mean = ko.observable();

// ...

ko.utils.arrayForEach(_this.scores(), function (score) {
    _this.mean += score;
    console.log(score);
    console.log(_this.mean);
});
_this.mean = _this.mean / _this.scores.length;
console.log(_this.mean);
return _this.mean;

_this.mean += score перезаписывает исходное наблюдаемое. Вместо этого это должно быть _this.mean(_this.mean() + score). Это происходит в паре мест.

То же самое касается доступа к наблюдаемому массиву scores. _this.scores.length должна быть _this.scores().length.

Вот код с внесенными изменениями...

ko.utils.arrayForEach(_this.scores(), function (score) {
     _this.mean(_this.mean() + score);
     console.log(score);
     console.log(_this.mean());
});
_this.mean(_this.mean() / _this.scores().length);
console.log(_this.mean());
return _this.mean();
  • 0
    Я сейчас получаю цифры, отлично. Спасибо! Отмечу, что наблюдаемые являются функциями.
  • 1
    Большой! Вот еще пара вещей, которые я заметил ... Не обязательно иметь mean и getAvgScore() (на самом деле, это может даже не работать). Просто сделайте mean значение вычисленным (используя большую часть того, что у вас есть для getAvgScore() ). Кроме того, массив scores вероятно, должен содержать наблюдаемые, а не простые числа, если вы хотите, чтобы средства менялись при изменении результатов.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню