2

StackOverflow コミュニティの助けを借りて、次の例に基づいてダーティ フラグの実装を機能させることができました

解決方法がわからない単一のユースケースを除いて、まさに私が望むことを行います。

基本的に、データベースから自動的に入力される選択メニューがあります。この選択メニューには、バックエンドに Ajax 呼び出しを行い、オプションのリストを更新し、データベースを更新して、result. これは私にとって物事が毛むくじゃらになるところです。

最初の方法は問題なく機能しますが、全体を再インデックスして再適用するviewModel必要があり、16 ギガの RAM と SSD を搭載したローカル マシンで実行すると、約 2 ~ 3 秒かかります。

jsondata.component.available_tags = result.available_tags;
ko.mapping.fromJS(jsondata, viewModel);

2番目の方法も機能し、ほぼ瞬時にisDirty()フラグが設定されますが、このデータはすでにデータベースから取得されており、保存する必要がないため、回避したいと考えています。メニューオプションをクリックして update する前に他の何かによって設定されていisDirty.reset()た場合、それもリセットされるため、メソッドも使用できません。私も避けたいところです。 isDirtyavailable_tags

viewModel().component.available_tags(result.available_tags);

私の質問は: 最初の方法ではko.mapping.fromJS()、データセット全体ではなく、特定の要素で UI を強制的に更新できますか? または、2 番目の方法で、更新isDirty時にフラグ セットを設定しないようにすることはできますか? available_tagsひねりは、まだオブザーバブルとして保持する必要があるavailable_tagsため、選択メニューが自動的に生成/更新されることです。

更新:その1つの要素のマッピングを更新できました

ko.mapping.fromJS(result.available_tags, {}, viewModel().component.available_tags);

しかし、それはすぐにisDirtyフラグを立てました...

4

1 に答える 1

1

私が完全に同意するTomalakの提案に加えて、モデルを分割したくない同様のケースでtoJSONメソッドが役立つかもしれません。Ryan Niemeyer のように、ダーティ フラグの実装で ko.toJSON をハッシュ関数として使用する場合、モデル (ダーティ フラグがアクティブなモデル) に toJSON メソッドを与えることができます。

function MyObjectConstructor() {
    this.someProperty = ko.observable();
    this.somePropertyNotUsedInDirtyFlag = ko.observable();
}
MyObjectConstructor.prototype.toJSON = function () {
    var result = ko.toJS(this);
    delete result.somePropertyNotUsedInDirtyFlag;
    return result;
};

これは、ajax 呼び出しなど、他の機会にオブジェクトをシリアル化するためにも使用されることに注意してください。通常、別のコンテキストで使用する前にオブジェクトから計算などを削除するための便利な関数です。

于 2013-11-14T13:54:27.997 に答える