Ошибка с суммированием значений в строке с использованием knockout.js и ko.computed

Я думаю, что это действительно основная проблема, но я просто не вижу ошибки. Я получил следующую простую модель:

var Row = function(col1, col2)
{
    var self = this;

    self.column1 = ko.observable(col1);
    self.column2 = ko.observable(col2);
    self.sum = ko.computed(function(){
        var col1 = isNaN(parseInt(this.column1)) ? 0 : parseInt(this.column1);
        var col2 = isNaN(parseInt(this.column2)) ? 0 : parseInt(this.column2);

        return col1 + col2;
    });
}


var RowViewModel = function()
{
    this.rows = ko.observableArray([
        new Row(10, 20),
        new Row(10, 20)
    ]);
}

 ko.applyBindings(new RowViewModel);

Как видите, я хочу суммировать только два значения в строке таблицы с помощью функции ko.computed. Но это всегда показывает мне NaN (если я не проверяю это) или "0". Я действительно много пробовал, но не могу понять, в чем проблема. Вот мой jsfiddle: http://jsfiddle.net/r2JQw/4/

1 ответ

Решение

У вас есть две проблемы:

  • ko.observable возвращает функцию, поэтому вам нужно получить ее значение, вызвав ее как функцию с (), Например: self.column1() а также self.column1()
  • по умолчанию this внутри вычисляется не "текущий" объект, поэтому вы должны использовать self вместо (или передать this как второй аргумент ko.computed)

Так что исправлено sum будет выглядеть так:

self.sum = ko.computed(function(){
    var col1 = isNaN(parseInt(self.column1())) ? 0 : parseInt(self.column1());
    var col2 = isNaN(parseInt(self.column2())) ? 0 : parseInt(self.column2());

    return col1 + col2;
});

Демо JSFiddle.

Другие вопросы по тегам