1

私はknockout.jsマッピングによってIEで無限の再帰を持っています。KOに精通している人が、私が間違っていることを見つけることができますか?

私は次のknockout.jsマッピングを持っています:


        var mapping = {
            create: function(options) {
                return new MyViewModel(options.data);
            },
            'ChildItems': {
                create: function(options) {
                    return new ChildVM(options.data);
                }
            }
        }

ページをレンダリングすると約 5つのIEのうち1つは、無限再帰スタックをたどることになります(「SCRIPT28:スタックスペースが不足しています」が発生します)。IEのコールスタック:


    fromJS
    MyViewModel
    create
    Anonymous Function
    withProxyDependentObservable
    createCallback
    updateViewModel
    fromJS
    MyViewModel
    create
    Anonymous Function
    withProxyDependentObservable
    createCallback
    updateViewModel
        ...

私のビューモデルコンストラクター:

 function MyViewModel(data) {
            var self = this;
            this.$type = 'MyViewModel';

            [some observables]         
            ...

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

ビューモデルの初期化は、jsonエンドポイントを呼び出すことによって行われます。


            $.ajax({
                url: 'http://my.end/point',
                type: 'POST',
                data: JSON.stringify(payload),
                contentType: 'application/json; charset=utf-8',
                success: function(data) {
                    window.vm = ko.mapping.fromJS(data, mapping);
                    ko.applyBindings(window.vm)
                    }
            });

4

1 に答える 1

2

マッピングオブジェクトを2つのオブジェクトに分割する必要があります。最初にビューモデルのマッピングに使用し、2番目に子に使用します。

var mapping = {
            create: function(options) {
                return new MyViewModel(options.data);
            }
        }

var childrenMapping = {
                'ChildItems': {
                    create: function(options) {
                        return new ChildVM(options.data);
                    }
                }
}

ajaxリクエストは同じままです。ChildrenMappingを使用するようにMyViewModel関数を更新します。

 function MyViewModel(data) {
            var self = this;
            this.$type = 'MyViewModel';

            [some observables]         
            ...

            ko.mapping.fromJS(data, childrenMapping, this);
        }

この問題の根本的な原因は、マッピングの再帰的な呼び出しです。ノックアウト呼び出しを呼び出すときko.mapping.fromJS(data, mapping);は、MyViewModelオブジェクトを作成するルールを作成します。同じマッピングオプションを使用するために呼び出すMyViewModelのコンストラクターko.mapping.fromJSでは、ノックアウトは、同じオプションで呼び出されるMyViewModelオブジェクトを作成する同じ作成ルールを呼び出しko.mapping.fromJSます。

于 2012-08-17T13:24:23.847 に答える