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);
}
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";
});