3

渡したい複雑なオブジェクトがko.mapping.fromJSあり、問題は、1 つのフィールドだけを監視可能にしたいということですが、他のプロパティは、試した方法に基づいて null または存在しないと見なされます。

私の問題を説明するために、ここで jsFiddle を作成しました。内部オブジェクトを観察可能にする必要がないため、内部オブジェクトを単純にコピーしたいと考えています。これらの数を考慮すると、余分なオーバーヘッドは必要ありません。

これの目標は、qty編集可能にすることですがinner.name、テキスト ボックスでは同じままです。これは、一方がオブザーバブルであり、他方がそうでないことを意味します。

マッピングを含まない別の方法がある場合は、ぜひ聞いてください。私のビューモデルにはかなりの数の関数などがあり、データは AJAX 呼び出しから入ってきます。

function viewModel() {
    var self = this;
    self.slots = ko.observableArray([]);

    self.load = function() {
        ko.mapping.fromJS(
            [
                { 'qty': 1, 'inner': { 'name': 'thing'} },
                { 'qty': 2, 'inner': { 'name': 'stuff'} }
            ],
            { 'include': ['qty'], 'ignore': ['inner.name'] },
            self.slots);
    }
};

ko.applyBindings(new viewModel());

<button data-bind="click: load">Go</button>
<ul data-bind="foreach: slots">
    <li>
        <span data-bind="text: qty"></span>&nbsp;<span data-bind="text: inner.name"></span><input data-bind="value: qty" /><input data-bind="value: inner.name" />
    </li>
</ul>
4

1 に答える 1

4

プロパティを監視できないようにしたいので、copy代わりに使用する必要があります。ignore

また、配列を直接マッピングしているため、マッピング構成が少し複雑になります。

copyルートに配列があるため、「ルート」レベルで定義することはできません。したがってcreate、アイテムに関数を提供する必要があり、作成関数でcopyアイテムのプロパティのオプションを指定できるようになりました。

   ko.mapping.fromJS(
        [
            { 'qty': 1, 'inner': { 'name': 'thing'} },
            { 'qty': 2, 'inner': { 'name': 'stuff'} }
        ],
        {
            create: function (options) {
                return ko.mapping.fromJS(options.data, {
                    copy: ['inner.name']
                })
            }
        },
        self.slots);

JSFiddle のデモ。

于 2013-04-03T21:00:35.430 に答える