1

この単純なテストが実行時エラーをスローする理由を理解するのに本当に問題があります。

FilterClause オブジェクトの一部として、計算されたノックアウト プロパティ 'Level' を取得しました。ドキュメンテーションを忠実に実行しましたが、まだランタイム エラーがスローされます...

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

計算内のコンテキストに問題があります。エラーを修正する方法は 2 つあります。最初に、これを 2 番目のパラメーターとして計算済みに追加します。

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

作業フィドル: http://jsfiddle.net/bajGm/1/

または2番目-これを変数に割り当てます:

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 に答える