2

私の実際のプロジェクトに基づいて、このテストコードを使用します。

var test = ko.mapping.fromJS({ id: 1, kids: [{ name: "sue"}] });
test.kids.push({ name: "tim" });
test.kids.push(ko.mapping.fromJS({ name: "joe" }));
console.log(test);
console.log(test.kids()[0]);
console.log(test.kids()[1]);
console.log(test.kids()[2]);
test.kids()[2].__ko_mapping__ = undefined;
console.log(test.kids()[2]);

Firebug のコンソール出力には次のように表示されます。

Object { __ko-mapping__={...}, id=d(), kids=d() }
Object { name=d() }
Object { name="tim" }
Object { __ko-mapping__={...}, name=d() }
Object { name=d() }

私の目標はkids、データの最初のマッピング後に配列に項目を追加し、それらの項目を追加された元の項目と同じに見せることです。配列にオブジェクトを直接プッシュするだけでは、プロパティは観察可能ではありません。を使用してオブジェクトをプッシュするko.mapping.fromJSと、余分な__ko_mapping__オブジェクトが含まれます。余分なオブジェクトは必要ないように思われるため (元のアイテムにはそれがなく、正常に動作します)、後で何千ものアイテムを追加する場所でこの同じデザインを使用する可能性があるため、追加のオブジェクトを使用したくありません。

オブジェクトを に設定undefinedすると、余分なオブジェクトが削除されるように見えますが、可能であれば最初から作成したくないでしょう。

4

3 に答える 3

1

他の回答がないことに基づいており、唯一の回答はおそらくより優れた設計手法ですが、実際には私が要求したこととは反対のことを行います(すべての子にマッピングオブジェクトを追加します).私はすでに答えを持っていたと思います.私の最初の質問では、もっと良い方法があるに違いないと仮定しました。

したがって、将来の読者のために、ここにあります:

test.kids()[2].__ko_mapping__ = undefined;

削除したい場合は、ko_mappingを undefined に設定してください。

これが一般的に良い考えではない理由については、コメントとその他の回答を参照してください。私のニーズのために、そしておそらくあなたも同じことを持っているので、それは良い考えです.

于 2013-05-02T22:57:39.413 に答える
0

私は通常、'Kids' の強力なプロトタイプを作成し、マッピング プラグインに初期データのマッピング時にそれを使用するように指示すると便利だと思います。これにより、配列の内容が同一になり、Kid ごとに計算されたものと観測可能なものを許可するという利点が追加されます。

http://jsfiddle.net/Z9GF5/

var Kid = function(json){
    ko.mapping.fromJS(json, {}, this);
}

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

アイテムを追加する必要がある場合は、新しいキッズを作成してください。

var test = ko.mapping.fromJS({ id: 1, kids: [{ name: "sue"}] }, mapping);
test.kids.push(new Kid({ name: "tim" }));
test.kids.push(new Kid({ name: "joe" }));
console.log(test);
console.log(test.kids()[0]);
console.log(test.kids()[1]);
console.log(test.kids()[2]);

Firebug は次のように表示します。

Object {id: function, kids: function, __ko_mapping__: Object}
Kid {name: function, __ko_mapping__: Object}
Kid {name: function, __ko_mapping__: Object}
Kid {name: function, __ko_mapping__: Object}
于 2013-04-30T13:58:22.387 に答える
0

http://knockoutjs.com/documentation/plugins-mapping.html

どのプロパティをどのようにマッピングするかを選択できます。

于 2014-06-10T19:05:20.893 に答える