0

各レベルでさまざまな不要なプロパティを省略し、基本的な階層を保持するノックアウト ビュー モデル構造で表現しているサーバーからの深いオブジェクト グラフがあります。

ノックアウト マッピング プラグインを双方向で使用しています。ルートの下の各ビュー モデル レベルで、現在のビュー モデルの "コンストラクター" は、参照として保持する親ビュー モデルと、それ自体を構築するために必要な元のデータの一部を受け入れます。次に、マッピング オプションの新しいセットを作成して、独自の子を作成します。

これを説明する非常に単純化されたフィドルを作成しました。

http://jsfiddle.net/tqPtG/17/

取得時にサーバーから必要な大量の読み取り専用メタデータがありますが、グラフを JSON としてポストするときは省略してください。各レベルで toJSON プロトタイプ メソッドを使用して不要なものを選別してきましたが、これはある時点でうまく機能していましたが、現在は機能しなくなりました。

ローカルでは、私の toJSON オーバーライドは (アラートとコンソール ログに基づいて) 起動さえしていないように見えますが、このフィドルでは起動しますが、最終的なオブジェクトには削除されたプロパティ「子」がまだ含まれています。toJSON メソッドによって削除されていることがわかりますが、ルートのマッピング解除後も存在し、アラートに表示されます。

では、2 つの質問 - toJSON オーバーライドがローカルで起動しない原因と、単純化されたフィドルのマッピング解除ロジックの誤解はどこにありますか?

よろしくお願いします。

4

1 に答える 1

2

ここでいくつかのことが起こっています:

  • あなたのtoJSON関数は呼び出されていますが、ko.mapping.toJSON呼び出しの一部としてではありません。マッピング プラグインは、オブジェクトのキーを決定する一環として文字列化を行います。
  • ko.mapping.toJSONはオブジェクトの平面コピーを作成し、その時点で のインスタンスではなくなりますParentViewModel。次に、オブジェクトを文字列化すると、toJSON関数を実行する理由がなくなります。

への呼び出しko.mapping.toJSONは、オプションの 2 番目の引数をサポートしています。{ ignore: ['child'] }この引数として次のように渡すことができます: http://jsfiddle.net/rniemeyer/4kHC2/

于 2012-06-22T02:10:09.027 に答える