2

js とノックアウト マッピング プラグイン

私の問題はこれです:

私はモデルを持っていて、実行時にオブザーバブルを次のように追加しています:

viewModel[value] = new ko.observable(valueFromTextBox);

これは問題なく動作し、オブザーバブルは画面にバインドされており、この部分は問題なく動作します。問題の部分は、そのモデルを取得して JSON に変換しようとしたときです。

var JSON = ko.mapping.toJS(page.model);

これをデバッグすると、page.model にすべての新しいオブザーバブルがあることがわかります。しかし、私の最終的な JSON には、最初からモデルに含まれていたものしかありません。後で実行時に追加されるものではありません。実行時にオブザーバブルを追加する正しい方法は何ですか?

ありがとう

編集:

シナリオ全体を説明し、ソリューションを回答として投稿します。

私は ASP.Net MVC を使用しています。ビュー モデルを作成し、サーバーから実際のモデルを受け取るために ajax 呼び出しを行いました。次に使用します:

ko.mapping.fromJS(model, page.model);

その後、ユーザーが私が使用した新しいフィールドを追加すると、バインディングが後で発生します。

viewModel[value] = new ko.observable(valueFromTextBox);

そして最後に、私が使用したサーバーに送り返す前に:

 var JSON = ko.mapping.toJS(page.model);

その時点で、追加されたフィールドは JSON に存在しませんでした。

4

2 に答える 2

3

デバッグ後

ko.mapping.fromJS(model, page.model);

関数が辞書の値を読み取ることに気付きました

    __ko_mapping__.mappedProperties

toJS関数の使用中に作成される

var JSON = ko.mapping.toJS(page.model);

とにかく、新しく追加されたオブザーバブルが__ko_mapping__.mappedProperties辞書に存在しなかったため、ko.mapping.toJS 関数を使用して返された JSON オブジェクトにも存在しなかったため、機能させるために私がしたことは次のとおりです。

viewModel[value] = ko.observable(valueFromTextBox);
viewModel.__ko_mapping__.mappedProperties[value] = true;

モデルにオブザーバブルを追加しますが、mappedProperties ディクショナリも更新します。それだけです。モデル全体を呼び出すとko.mapping.toJS、追加されたオブザーバブルを含む JSON オブジェクトとして返されます。

これはおそらく最もエレガントな方法ではないことを認識しています。しかし、それは確かにうまく機能します。

于 2012-08-22T11:18:13.927 に答える
1

.toJS ではなく .toJSON のことですか?

この状況は私にとってはうまくいきましたが、「new」を使用する必要はないと思いますが、次のようにする必要があります。

viewModel['PropertyName'] = ko.observable(値);

実際には、new の有無にかかわらず、両方の方法が機能しましたが、すべてのドキュメントでは、ファクトリ メソッドのように、それなしで使用されています。あなたの問題を示すフィドルを作成できますか?

于 2012-08-14T10:45:09.023 に答える