3

ViewModelのマスターソースからダイアログにいくつかのデータを複製する必要があります。その理由は、ユーザーがダイアログをキャンセルする可能性があり、キャンセルされた変更をマスターに反映させたくないためです。

マスターデータの複製コピーをダイアログに作成し、データバインディングが「localEdited。*」プロパティを取得するように設定されています。ユーザーが[OK]をクリックした場合、編集されている場合はデータをマスターに永続化して戻します。それ以外の場合は、新しいデータの場合はデータをプッシュします。

   editItem: function(data) { 
            // clone a temporary copy for the dialog                    
            this.localEdited = ko.mapping.fromJS(ko.toJS(data));               
            $("#dlgAdd").dialog("open");
        },

上記は現在機能していますが、マスター内の別のアイテムをクリックすると、ダイアログに更新された値が表示されません。ko.mapping.fromJSが一度だけ機能し、その後は二度と機能しないかのようです。常に最初の値を取得します。この問題を回避するにはどうすればよいですか?値を再バインドする必要があるように感じますが、KOの全体的なポイントはこれを行う必要がないことです。

データを親に永続化するにはどうすればよいですか。私は上記と同じ問題を抱えているのではないかと思います。

ところで、私はKnockoutJS1.2.1を使用しています。

4

1 に答える 1

4

localEditedは監視可能である必要があり、editItemが呼び出されるたびにノックアウトがダイアログを再バインドするようthis.localEdited(ko.mapping.fromJS(ko.toJS(data)))に関数で実行する必要があります。editItemダイアログのデータバインディングをlocalEdited()。*に変更する必要があります。

監視可能でなくても逃げることができますが、この場合、関数内localEditedの監視可能な各プロパティを手動で更新する必要があります。だからあなたは次のようなものを持っている必要がありますlocalEditededitItem

this.localEdited.property1(data.property1());
this.localEdited.property2(data.property2());

重要なのは、関数呼び出し構文を使用してオブザーバブルを更新する必要があるということです。このようにして、ノックアウトは更新をキャッチし、バインディングを介してそれを伝播します。最初のコードでは、に単純な割り当てを行うだけなlocalEditedので、ノックアウトには、その魔法を傍受して実行するためのフックがありません。

更新:ko.mappingプラグインは、モデル内の個々のオブザーバブルを自動的に更新できるため、手動で更新する必要はありません。

ko.mapping.fromJS(ko.toJS(data), this.localEdited);
于 2012-02-09T17:09:41.867 に答える