【问题标题】:Revert model changes without Ember-Data在没有 Ember-Data 的情况下恢复模型更改
【发布时间】:2016-03-29 12:01:27
【问题描述】:

我有一个从 JSON 对象创建的模型,该对象具有绑定到 UI(首选项面板)的许多属性。我想允许用户更新他们的偏好,但我还需要一种方法让他们在对 UI 进行更改后恢复对模型的更改。

我看到很多使用 Ember-Data 的示例,但我们没有使用它;我也没有在 Ember 文档中看到任何明显的模式/方法。是否有一种常用的模式可以在没有 Ember-Data 的模型上实现“回滚”?

【问题讨论】:

    标签: json user-interface ember.js ember-data


    【解决方案1】:

    这实际上取决于您的模型的结构。我编写了自己的 Ember 持久性库,并将每个属性都设为计算属性(如 Ember-Data)。从那里,我在每个模型中有两个哈希值,oldPropertiesnewProperties。我使用两者串联阅读,只写给newProperties。这样我就可以在必要时恢复到oldProperties

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

    【讨论】:

    • 我最终采用了与此类似的解决方案。我将我的 Singleton 模型标记为 Freezable 和 Copyable。然后在初始化时,创建了模型的两个实例;一个是单例返回的正常实例,另一个是原始值(或保存成功后的值)。我还将观察者添加到感兴趣的属性中,并跟踪它们是否发生变化。如果我需要撤消未保存的更改,我可以调用一个 revert() 方法来仅复制已更改的属性。
    • 这很聪明。我从来没有想过冻结这个物体。很高兴你成功了。
    【解决方案2】:

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

    在路上

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

    然后在控制器的取消动作中:

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

    如果您在“接受”更改之前不想修改模型,则可以恢复模式。在这种情况下,您将克隆设置为控制器的属性,然后在保存时复制属性并取消将简单地离开,基本上丢弃克隆对象中的更改。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这是一个特定于 ember-data 的函数,它不适用于我们,因为我们没有使用 DS。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 2021-04-05
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2015-11-29
      相关资源
      最近更新 更多