2つの違いは何ですか?
ラップされていないオブザーバブルがjsプリミティブにストリップダウンするので、確かにそれらは同じものです。では、なぜko.toJSまたはその逆があるのでしょうか。
また、なぜko.mapping.toJSがあるのですか?これはko.toJSと効果的に同じことをしませんか? knockoutJSには同じことをする関数がいくつかあるようですが、それらが存在する理由があるに違いありません。
それらの間には違いがあります。
ko.toJS はオブジェクトを取得して「開き」、すべての監視対象からオブジェクトをクリーンアップします。これは、オブジェクトグラフ全体に対して行われます。私はシリアライザーのように動作します。つまり、たとえば循環参照がある場合に問題が発生します。 mapJsObjectGraph を内部的に使用しますが、これは複雑すぎて、今のところ完全にコンパイルすることはできません。ただし、サーバーに投稿する必要がある場合に使用する傾向があります。
ko.utils.unwrapObservable は、値が監視可能であるかどうかを単純に判別し、監視可能である場合は、基になる値を返します。そうでない場合は、値を返すだけです。マッピングプラグインを使用している場合、たとえば、観察可能なモデルと観察不可能なモデルの両方を持つことができるモデルになってしまう可能性がある場合に便利です。
ko.mapping.toJS は、機能の点で多少重複していると思われるリストの1つだけです。これは、マップされたオブジェクトグラフを元の状態にマップするために使用されます。 ko.toJSよりもはるかに複雑ではないように見えますが、私はまだ使用していないので、正直に言ってそれについて詳しく説明することはできません。それについてもっと読む ここ 。
ko.mapping.toJS(...)
とko.toJS(...)
に関して
これにより、元のJSオブジェクトの一部であったマップされたオブジェクトのプロパティのみを含むマップされていないオブジェクトが作成されます。つまり、ビューモデルに手動で追加したプロパティや関数はすべて無視されます。デフォルトでは、このルールの唯一の例外は_destroyプロパティです。これは、ko.observableArrayからアイテムを破棄したときにKnockoutが生成する可能性があるプロパティであるためです。これを構成する方法の詳細については、「高度な使用法」セクションを参照してください。
つまり、マッピングプラグインは、ITが作成したものだけを変換します。ビューモデルをマージしたり、計算されたオブザーバブルや通常のオブザーバブルを追加したりした場合、それらはモデルに戻りません。
ハイブリッドビューモデル(一部がマップされ、一部が手動で作成されている)がある場合は、ハイブリッド方式でサーバーに送り返すJSONを作成するのが最適な場合があります。
これをページに配置して、2つのモデルの違いを確認できます。
<h2>ko.TOJSON()</h2>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
<h2>ko.mapping.toJS</h2>
<pre data-bind="text: JSON.stringify(ko.mapping.toJS($root), null, ' ')"></pre>
(ko.mapping.toJSON
からの応答を「きれいにする」方法がわからなかったので、JSON.stringifyを使用しました
これがko.mapping.toJSとko.toJSの方法です。
var viewModelRaw = { prop: 0 };
var viewModel = ko.mapping.fromJS(viewModelRaw);
var _raw = ko.mapping.toJS(viewModel); // = { prop: 0 }
var _rawWithTraces = ko.toJS(viewModel); // = { prop: 0, __ko_mapping__: .... }
ご覧のとおり、ko.mapping.toJS()は、ビューモデルを反映したクリーンなJSオブジェクトを返します。
ノックアウトプロパティを残さずに、ko.toJS()はいくつかのノックアウトプロパティを残します。
なぜ彼らがそのようにしたのか分かりません...