我有一个场景,我在页面中列出产品,并允许用户仅在模态窗口中编辑产品的属性。
当用户点击产品并开始编辑产品的属性时,更改会立即传播到产品列表页面中的产品,并且页面的任何部分直接或间接地绑定到正在进行更改的属性。不是理想的行为。只有在用户确认更改时才会传播更改,即单击保存按钮,事务已提交和模式窗口已关闭
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}}
答案 0 :(得分:0)
您正在编辑的完全相同的对象,因为您正在键入的文本字段绑定到属性,并且主列表中的表示也绑定到它们的相同属性得到更新。
Ember-data将op持久对象注意到后端而不是应用程序中的状态。
你应该看看this。它解释了如何创建一个懒惰的文本域对象,它不会立即使用绑定更新对象,而是仅在单击“保存”按钮后。