1

我在理解为什么这个简单的测试会引发运行时错误时遇到了真正的问题。

我有一个淘汰赛计算属性'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/

4

2 回答 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。它详细解释了您的问题的根本原因。

于 2013-07-12T13:20:42.500 回答
1

在计算出的 Padding 中,this 指的是 window。

为避免这种情况,您应该创建一个自私有字段:

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

见小提琴

于 2013-07-12T13:23:32.900 回答