2016-09-27 99 views
3

在尚未保留到后端的路由模型的上下文中(其ID仍为null,我们尚未称为save),如果我们想要丢弃记录,使用unloadRecord还是destroy更正确?Ember:unloadRecord与新记录之间的区别

上下文:用于表单转换离开但不保存或取消。我是新来的烬,我有点困惑unloadRecord是私有的模型,但不适用于商店。这可能是显而易见的,但当我们将对象称为模型或记录是正确的时,我也并不积极(我假设它们有时可以互换使用,但如果它们是现有实例,则将它们称为记录在技术上是正确的)。

回答

1

对于这种情况rollbackAttributes方法存在。如果模型尚未保存,它将从商店中删除。此外,请勿在用户单击保存之前创建模型,但是:

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

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

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

Store的unloadRecord卸载坚持从商店记录(所以你不会有在本地,但可有或没有它的后端)。

+0

在你看来,为什么'rollbackAttributes'比'destroyRecord'更正确? – maffews

+0

@maffews'destroyRecord'的用途是删除**持久存储和后端记录**,而问题是关于新记录,尚未保留。这就是为什么使用它不太正确。您无法保证在未来的版本中它可以正常工作而不会保留记录。 –

+1

在文档或代码注释中完全支持此功能吗?我搜索了两个,我找不到任何说'destroyRecord'只用于保存记录。基于'destroyRecord'处理未保存记录的方式以前被视为[bug](https://github.com/emberjs/data/issues/1593),我认为'destroyRecord'和'deleteRecord'如果不是比'rollbackAttributes'更适合的话。 – maffews

2

unloadRecord - 是正确的选择。

Model - destroyRecord - >将调用适配器deleteRecord,这意味着它会将特定记录的删除请求提交给服务器。

商店 - unloadRecord - >它只会从商店卸载,它不会提出任何请求到服务器。你只能卸载非脏记录

模型 - unloadRecord - >它并不是必需的。因为如果创建了记录,那么您将在商店中进入,因此您可以随时通过商店的unloadRecord方法删除非脏记录。

+0

在新创建的记录上调用destroyRecord确实会导致对save的调用,但Ember可以智能地处理它,并且实际上不会执行远程请求来将更改持久化到服务器。 – maffews

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,将其从商店中删除

相关问题