【问题标题】:Best way to rollback all changes to an Ember Data model回滚对 Ember 数据模型的所有更改的最佳方法
【发布时间】:2016-04-28 01:20:43
【问题描述】:

我正在使用 ember-data 来编辑具有自动模型分辨率的用户

this.route('user', function() {
  this.route('edit', { path: ':user_id'})
});

这很好用,用户可以修改模型DS.attributeDS.belongsToDS.hasMany的所有方面。

用户可以通过多种方式离开,在这种情况下,应从模型中删除所有更改。

  • 单击Cancel 按钮
  • 点击Broswer Back按钮
  • 点击Save按钮,远程请求fails,然后离开页面。
  • 只需单击页面上的其他链接即可将它们带到其他地方。

只有在用户明确希望通过单击Save 按钮并且服务器请求成功时才能应用更改。

我考虑过使用ember-buffered-proxy,但我不确定这将如何处理 DS.belongsTo 和 DS.hasMany 关系。无论如何,在保存模型之前,我需要在保存之前执行buffer.applyBufferedChanges();,如果服务器出现故障,我会像以前一样处于保存状态。

路由中的willTransition 钩子似乎是执行此操作的明显位置,但我如何确保从模型中删除所有更改,因为rollbackAttributes() 仅适用于DS.attribute 控件。

【问题讨论】:

  • 如果你使用“Actions up, data down”原则(1)(2)并在模板中使用单向绑定,这样编辑时的更改不会立即传播到模型,而是当你单击“保存”,然后可以通过适当的操作更新模型(以便模型拥有更新自身的代码,而不是将其分散在许多路由/组件中),如果您离开编辑页面,则更改是刚刚被丢弃。
  • 看不出这是如何解决问题的,因为 ember-data 模型是从 routes 模型挂钩返回的模型。
  • 然后返回一个空对象,然后将其保存为模型,您会考虑这样做吗?
  • @TameBadger 从哪里返回一个空对象?承诺?
  • 路由模型钩子

标签: ember.js ember-data


【解决方案1】:

尝试在路由的 willTransition() 操作钩子中使用 Ember.Route refresh() 方法,如下所示:

action: {
  willTransition() {
    const unsavedModel = this.get('unsaved');
    if (unsavedModel) {
      this.refresh();
    }
  }
}

refresh() 方法可用于“使用与首次输入路由时相同的参数重新查询服务器以获取最新信息。”

我建议了一个名为unsaved 的标志,它可以默认为true,除非在转换之前成功的save 期间的某个时刻它被设置为false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2011-01-24
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多