Emberjs:防止整个交易中的变更传播

时间:2013-01-17 18:44:26

标签: ember.js ember-data

我有一个场景,我在页面中列出产品,并允许用户仅在模态窗口中编辑产品的属性。

当用户点击产品并开始编辑产品的属性时,更改会立即传播到产品列表页面中的产品,并且页面的任何部分直接或间接地绑定到正在进行更改的属性。不是理想的行为。只有在用户确认更改时才会传播更改,即单击保存按钮,事务已提交和模式窗口已关闭

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}}

1 个答案:

答案 0 :(得分:0)

您正在编辑的完全相同的对象,因为您正在键入的文本字段绑定到属性,并且主列表中的表示也绑定到它们的相同属性得到更新。

Ember-data将op持久对象注意到后端而不是应用程序中的状态。

你应该看看this。它解释了如何创建一个懒惰的文本域对象,它不会立即使用绑定更新对象,而是仅在单击“保存”按钮后。