1

計算フィールドのプロパティ 'owner' がビュー モデルの子要素に設定されている場合、ko.mapping を使用してビューモデルを更新すると、計算された値が削除されるようです。

この場合のように、親の配列 (それぞれにいくつかの子要素を持つ) があり、各親の計算フィールドに子の年齢の合計を表示する必要があります。

初めて ViewModel を適用するとすべて正常に動作しますが、計算フィールドの作成後にマッピングを再適用すると、それらは削除されます。

<div data-bind="foreach: parent">

    <div class="cell"><span class="" data-bind="text : $data.comp"></span></div>
</div>
<span data-dind="text: comp"></span>
<script type="text/ecmascript">

    var viewModelJs = { 'parent': [{ 'name': 'pippo', 'childAge': [{ 'age': 15 }, { 'age': 18 }] }, { 'name': 'pluto', 'childAge': [{ 'age': 5 }, { 'age': 13 }] }] };


    var viewModel = ko.mapping.fromJS(viewModelJs);

    for (var index in viewModel.parent()) {
        var parent = viewModel.parent()[index];
        parent.comp = ko.computed(
            {
                read: function () {
                    var parent = this;
                    var sum = 0;
                    for (var j in parent.childAge()) {
                        var age = parent.childAge()[j].age();
                        sum += parseInt(age);
                    }
                    return sum;
                },
                owner: parent
            });
    };

    ko.applyBindings(viewModel);

    viewModelJs = { 'parent': [{ 'name': 'paperino', 'childAge': [{ 'age': 5 }, { 'age': 18 }] }, { 'name': 'mario', 'childAge': [{ 'age': 5 }, { 'age': 13 }] }] };

    //Everything works fine so far...

    ko.mapping.fromJS(viewModelJs, viewModel);

    //now the computed fields are gone.

</script>

これらの計算フィールドを ko.mapping で保持する方法はありますか?

4

1 に答える 1

1

プロパティが配列内の 1 つの項目を一意に識別する場合、関数ko.mapping.fromJSへの最初の呼び出しを次のように置き換えてみてください。

var mapping = {
    'parent': {
        key: function(data) {
            return ko.utils.unwrapObservable(data.name);
        }
    }
};
var viewModel = ko.mapping.fromJS(viewModelJs, mapping);

2 番目のviewModelJs定義で同じ名前の値を使用します。

jsbinを参照してください

于 2012-09-11T12:49:49.443 に答える