ページに製品をリストし、ユーザーがモーダル ウィンドウでのみ製品のプロパティを編集できるようにするシナリオがあります。
ユーザーが製品をクリックして製品のプロパティの編集を開始すると、変更は製品リスト ページの製品にすぐに反映され、ページの任意の部分が変更を受けるプロパティに直接的または間接的にバインドされます。望ましい動作ではありません。変更は、ユーザーが変更を確認した場合、つまり、保存ボタンがクリックされ、トランザクションがコミットされ、モーダル ウィンドウが閉じられた場合にのみ伝播する必要があります。
transaction: APP.store.transaction(),
renderTemplate:function(controller, record) {
this.transaction.add(record);
// append the modal view
App.ModalView.create().append();
},
onSaveClick: function(record) {
this.transaction.commit();
this.transitionTo('products');
},
理想的には、トランザクションがコミットされるまで、製品に対する変更の伝播を停止するように Ember に指示する必要があります。beginPropertyChanges と endPropertyChanges を使用して、関連するオブザーバーへの通知を次のように延期しようとしました。
renderTemplate:function(controller, record) {
this.transaction.add(record);
record.beginPropertyChanges();
// append the modal view
App.ModelView().create().append();
},
onSaveClick: function(record) {
record.endPropertyChanges();
this.transaction.commit();
this.transitionTo('products');
},
これにより、変更がリストに反映されなくなりますが、トランザクションはコミットされず、モーダル ウィンドウが閉じられても項目はダーティのままです。
私はこれを適切に使用していないと確信しています。currentState に反映されているようにアイテムがコミットされていない限り、変更をストアから遠ざける方法が必要です
アイテム ステータス isDirty を使用しても、この問題の解決には役立ちません。これを使用すると、アイテムがリストから完全に削除されてしまい、これは受け入れられないからです。
{{#each item in controller}}
{{#unless item.isDirty}}
{{item.name}}
{{/unless}}