【问题标题】:Ember model rollback reset the view to previous stateEmber 模型回滚将视图重置为之前的状态
【发布时间】:2014-03-11 20:07:38
【问题描述】:

我有一个简单的表单(包含绑定到模型的一些文本字段和复选框),它可以使用 jQuery 的 slideToggle 显示或隐藏。

此表单有两个按钮:保存和取消。

基本上,当我需要对模型进行一些更改时,此表单会变得可见。单击保存按钮时,我会保存模型

this.get('model.content').save();

并隐藏表单。

取消也是如此。我试着打电话

this.get('model.content').rollback();

但它不会还原文本字段,也不会重置复选框。当我下次打开表单时,我希望它们处于以前的“未保存”状态。我该怎么做?

【问题讨论】:

    标签: javascript jquery ember.js ember-data


    【解决方案1】:

    在您的 Ember 2.10 组件中,添加:

      willDestroyElement() {
        this._super(...arguments);
        this.get('model').rollbackAttributes();
      }
    

    这将在表单组件从 DOM 中删除之前重置模型未保存的更改。当用户离开您的表单而不保存时,这尤其有用。然后,您将希望阻止所做的更改通过您的应用程序传播。这假设您将模型属性传递到输入字段,如下所示:

     {{input value=model.name}}
    

    http://emberjs.com/api/data/classes/DS.Model.html#method_rollback http://emberjs.com/api/classes/Ember.Component.html#method_willDestroy

    【讨论】:

    • 而不是willDestroy 方法,覆盖willDestroyElement 事件挂钩方法willDestroyElement(){ this._super(...arguments); //your tear down step } 。这就是他们在ember guides 中建议的内容。但是两者都应该如何工作。
    • @kumkanillam 你是完全正确的。感谢您指出这一点。
    【解决方案2】:

    你应该回滚模型:

    this.get('model').rollback();
    

    但是,依靠用户单击“取消”可能会出现问题 - 如果他们使用后退按钮导航会怎样?根据我的经验,最好将表单绑定到模型对象的副本,这样您就可以轻松地丢弃更改。 “保存”操作将从临时对象复制回路线模型并保存。另外,请考虑服务器未能保存的影响。您可能应该在致电save() 时使用then(),这样您就可以警告用户/恢复/回滚等。

    您可以将每个属性复制到“缓冲区”属性并在表单模板中执行以下操作:

    {{#with buffer}}
        {{input value=fieldOne}}
        {{input value=fieldTwo}}
    {{/with}}
    

    要在模型对象上创建 attributes 计算属性,请添加:

    attributes: function() {
        var model = this,
            result = [];
        Ember.keys(this.get('data')).forEach(function(key) {
            result.push(Ember.Object.create({
                model: model,
                key: key,
                valueBinding: 'model.' + key
            }));
        });
        return result;
    }.property()
    

    然后,要创建一个临时缓冲区供您的表单使用,您可以在控制器上执行此操作:

    setupController: function(controller, model) {
        var buffer={};
        controller.set('model', model);
        model.get('attributes').forEach(function(item) {
            buffer[item.get('key')]= item.get('value');
        });
        controller.set('buffer', buffer);
        this._super(controller, model);
    }
    

    我个人将它们用作Mixins,因此我可以轻松地将它们添加到我的所有模型对象并编辑控制器。

    【讨论】:

    • 谢谢史蒂夫!如何使用缓冲区?当我像这样把它放在我的表单周围时,它只是隐藏了内容。我需要如何在控制器中做某事?模型仍然什么都不做。我是否需要提交对模型的更改才能使其正常工作。请注意,当我单击“取消”时,模型上没有“保存”或设置任何内容,因此模型可能不知道要回滚到什么?我点击保存我只想在有人输入内容之前更改那里的方式。
    • 我已经用更多可以使用的代码更新了我的答案。
    • @SteveH。在需要访问模型时检查模型是否处于脏状态,如果是,则将其回滚是否更容易?
    • @Chachi-inactive 在我看来,当你不需要它时简单地扔掉缓冲区然后在重新进入路由时重新创建它更容易。您可以尝试以这种方式进行优化。
    • @SteveH。 - 所以我得出的结论是,回滚方法非常方便,直到您使用带有 ember-data 的自定义转换。 rollback() 不知道如何处理自定义数据,所以实际上并没有回滚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多