【问题标题】:Ember: difference between unloadRecord and destroy for new recordsEmber:新记录的 unloadRecord 和销毁之间的区别
【发布时间】:2016-09-27 20:16:37
【问题描述】:

在一个还没有持久化到后端的路由模型的上下文中(它的id仍然是null,我们还没有调用save),如果我们想丢弃记录,是不是使用unloadRecorddestroy 更正确?

上下文:当表单被转换离开但既没有保存也没有取消时使用。我是 ember 的新手,我对 unloadRecord 是 Model 私有但不是 Store 的事实感到有些困惑。这可能很明显,但我也不肯定将对象称为模型与记录是正确的(我假设它们有时可以互换使用,但如果它们是现有实例,将它们称为记录在技术上是正确的)。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    如果您创建但不保存记录,它将处于root.loaded.created.uncommitted 状态(Ember 2.4)。调用destroyRecord 将调度save,但也会立即将状态更改为root.deleted.saved,因此save 请求将永远不会被执行。

    您可以在浏览器中检查通过在新创建的记录上调用 destroyRecord 创建的网络请求来验证这一点。

    在调用destroyRecord 而不是unloadRecord 时,围绕调度save 执行了一些额外的工作,因此这里的权衡是在调度从不执行的保存和确定模型的额外复杂性之间删除记录之前的状态。

    unloadRecord - 从存储中卸载记录

    deleteRecord - 删除记录但不保存(必须调用save

    destroyRecord - 调用 deleteRecordsave

    rollbackAttributes - 回滚属性,或者,如果模型为 isNew,则将其从商店中删除

    【讨论】:

      【解决方案2】:

      unloadRecord - 是正确的选择。

      Model - destroyRecord -> 将调用适配器 deleteRecord 这意味着它将向服务器提出删除请求以获取特定记录。

      Store - unloadRecord -> 它只会从 store 中卸载,不会向服务器提出任何请求。你只能卸载非脏记录

      型号 - unloadRecord -> 完全不需要。因为如果创建了记录,那么您将在 store 中有条目,因此您可以随时通过 store 的 unloadRecord 方法删除非脏记录。

      【讨论】:

      • 在新创建的记录上调用 destroyRecord 会导致调用 save,但 Ember 会智能地处理此问题,并且不会实际执行远程请求以将更改持久保存到服务器。跨度>
      【解决方案3】:

      对于这种情况rollbackAttributes方法是存在的。如果模型尚未持久化,它将从存储中删除。另外,在用户点击保存之前不要创建模型,但是:

      1. 将表单绑定到控制器的属性。 (我通常使用包含所有模型字段的 POJO)

      2. 当用户点击保存按钮时,验证数据,创建模型并调用保存方法

      3. 如果将模型持久化到后端失败,则回滚属性。如果持久化成功,清除控制器属性(因此当用户添加下一个实体时,表单将是干净的)并重定向。

      Store 的 unloadRecord 从 store 中卸载 persisted 记录(因此您不会在本地拥有它,但在后端可能有也可能没有)。

      【讨论】:

      • 在您看来,为什么rollbackAttributesdestroyRecord 更正确?
      • @maffews destroyRecord 的目的是从存储和后端删除 persisted 记录,而问题是关于新记录,尚未持久化。这就是为什么使用它不太正确的原因。您无法保证它可以在未来版本中与未持久化的记录一起正常工作。
      • 文档或代码 cmets 是否完全支持这一点?我在两者中都进行了搜索,但找不到任何说 destroyRecord 仅适用于持久记录的内容。基于destroyRecord 处理未保存记录的方式以前被视为bug,我认为destroyRecorddeleteRecord 都是合适的,如果不超过rollbackAttributes
      • @maffews 我没有足够的时间参加这场圣战。您可以随意编写代码。在我看来,使用 deleteRecord / destroyRecord 是不正确的。文档对rollbackAttributes非常清楚,而destroyRecord只是碰巧起作用。
      • 如果你看一下调用rollbackAttributes如何导致新记录进入删除状态,你可以看到calling rollbackAttributes is just an indirect way to delete [编辑:对不起,我在刷新并看到你的评论之前发布了这个.这不是一场圣战,我只是想了解真相,以免传播不正确的信息]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多