将所有更改回滚到Ember Data模型的最佳方法

jax*_*jax 5 ember.js ember-data

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

this.route('user', function() {
  this.route('edit', { path: ':user_id'})
});
Run Code Online (Sandbox Code Playgroud)

这工作正常,用户可以修改模型的所有方面DS.attribute,DS.belongsToDS.hasMany.

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

  • 单击 Cancel按钮
  • 单击Broswer Back按钮
  • 单击Save按钮,远程请求fails,然后导航离开页面.
  • 只需点击页面上的其他链接即可将其带到其他位置.

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

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

willTransition路线中的钩子似乎是显而易见的地方,但我怎样才能确保所有更改都从模型中删除,rollbackAttributes()只有DS.attribute控件才有效.

jac*_*arm 1

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

action: {
  willTransition() {
    const unsavedModel = this.get('unsaved');
    if (unsavedModel) {
      this.refresh();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

我建议使用一个名为 的标志unsaved,该标志可以默认为,除非在转换之前在成功期间的某个时刻true将其设置为。falsesave