2014-02-25 91 views
3

我有一个从具有绑定到UI(首选项面板)的许多属性的JSON对象创建的模型。我希望允许用户更新他们的偏好,但我还需要一种方法让他们在对UI进行更改后恢复对模型的更改。我看到很多使用Ember-Data的例子,但我们没有使用它;我也没有在Ember文档中看到任何明显的模式/方法。在没有Ember-Data的模型中是否有常用的模式来实现“回滚”?在没有Ember-Data的情况下恢复模型更改

回答

2

这真的取决于您的模型的结构。我编写了自己的Ember持久性库,并让每个属性都有一个计算属性(如Ember-Data)。从那里,我在每个模型中有两个哈希,分别为oldPropertiesnewProperties。我使用这两个串联阅读,并只写入newProperties。这样我可以随时恢复到oldProperties,如果有必要。

底线是Ember本身不会为您存储旧的属性值。您将编写自己的自定义逻辑来存储旧值并在需要时进行恢复。

+1

我结束了与类似的解决方案。我将我的Singleton模型标记为Freezable和Copyable。然后在初始化时创建模型的两个实例;一个是Singleton返回的正常实例,另一个是原始值(或保存成功后的值)。我还向观察者添加了感兴趣的属性并追踪他们是否改变。如果我需要撤消未保存的更改,则可以调用revert()方法来仅复制已更改的属性。 – Geoff

+0

这很聪明。我永远不会想到冻结对象。真高兴你做到了。 – GJK

0

对我而言,有效的方法是克隆模型,然后在用户取消编辑时恢复到克隆版本。

在路线

listEditController.set('clonedModelContent', Ember.copy(modelContent)); 

然后在控制器的取消行动:

close: function() { 
    Ember.setProperties(@get('model'), @get('clonedModelContent')); 
    // navigate somewhere else 
} 

模式可能的情况下,被还原您不想修改模型直到更改“接受”。在这种情况下,您可以将克隆设置为控制器的属性,并且在保存时复制这些属性,取消将简单地离开,基本上放弃克隆对象中的更改。

希望这会有所帮助。

0

我喜欢在模型上使用rollbackAttributes()方法。

import Ember from 'ember'; 

export default Ember.Component.extend({ 
actions: {   
    cancelEdit: function() { 
     var model = this.get('objectBeingEdited'); 
     model.rollbackAttributes(); 
     this.toggleProperty('isEditing'); 
     } 
    } 
}); 
+0

这是一个特定于烬数据的函数,因为我们没有使用DS,所以它不适用于我们。 – Geoff

相关问题