Knockout - ошибка времени выполнения JavaScript: объект не поддерживает свойство или метод 'Level'

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

У меня есть нокаутируемое вычисляемое свойство 'Level' как часть моего объекта FilterClause, я следовал документации к письму, но все равно выдает ошибку времени выполнения...

JavaScript runtime error: Object doesn't support property or method 'Level'

Я думаю, что это как-то связано с тем, что объект не был создан во время создания, где объявлена ​​функция вычисляемого свойства. Но это следует, или, по крайней мере, кажется, следит за нокаутом документации к письму.

Смущенный!!

Вот мой код:

var FilterClause = function (json, parent) {
    this.FilterClauseID = ko.observable();
    this.Type = ko.observable();
    this.Left = ko.observable();
    this.Right = ko.observable();
    this.ParentID = ko.observable();
    this.Parent = ko.observable(parent);
    this.Children = ko.observableArray();
    this.Level = ko.observable(0);

    // computed
    this.Padding = ko.computed(function () {
        return this.Level().ToString() + "px";
    });

    var mapping = {
        'Children': {
            create: function (args) {
                return new FilterClause(args.data, this);
            }
        },
        'ignore': ["Parent"]
    };

    ko.mapping.fromJS(json, mapping, this);
}

http://jsfiddle.net/bajGm/

2 ответа

Решение

У вас есть проблема с контекстом внутри вычисляется. Есть 2 способа исправить ошибку. Во-первых, добавить это в качестве второго параметра для вычисления:

this.Padding = ko.computed(function () {
    return this.Level().ToString() + "px";
}, this);

Рабочая скрипка: http://jsfiddle.net/bajGm/1/

Или второе - назначьте это переменной:

var self = this;
self.FilterClauseID = ko.observable();
self.Type = ko.observable();
self.Left = ko.observable();
self.Right = ko.observable();
self.ParentID = ko.observable();
self.Parent = ko.observable(parent);
self.Children = ko.observableArray();
self.Level = ko.observable(0);

// computed
self.Padding = ko.computed(function () {
    return self.Level().toString() + "px";
})

Рабочая скрипка: http://jsfiddle.net/bajGm/3/

Внимательно прочитайте эту статью http://knockoutjs.com/documentation/computedObservables.html. Он подробно объясняет причину вашей проблемы.

В вычисляемом заполнении это относится к окну.

Чтобы избежать этого, вы должны создать собственное поле:

var self = this;
self.FilterClauseID = ko.observable();
self.Type = ko.observable();
self.Left = ko.observable();
self.Right = ko.observable();
self.ParentID = ko.observable();
self.Parent = ko.observable(parent);
self.Children = ko.observableArray();
self.Level = ko.observable(0);

// computed
this.Padding = ko.computed(function () {
    return self.Level().toString() + "px";
});

Смотри скрипку

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