【问题标题】:Ember-Data destroyRecord stays in local storeEmber-Data destroyRecord 保留在本地存储中
【发布时间】:2015-01-05 12:06:19
【问题描述】:

我正在使用 ember 1.8.1 和 ember-data beta 12

如果我执行 createRecord 并且用户选择不保存它,那么在我尝试执行 model.destroyRecord() 的路由停用时,它仍然可以在我的本地商店中使用 currentState.stateName: root。已删除。保存

我似乎无法从本地商店中删除它,我不知道为什么。为什么记录的 stateName 为 root.deleted.saved 并且在我执行 store.find 时仍然可用?

编辑: 我不知道这是否重要,但是在取消并销毁记录(或尝试销毁记录)之后,我最终到达了一个使用 each 和 itemController 的位置。我认为,我的怪异是从它的介绍开始的。

// new/route.js  (using ember-cli pods)
deactivate: function() {
    this._super();
    // if we navigated away without saving the model we should remove it
    //  so we don't have 'unsaved' items displayed anywhere
    var model = this.controller.get('model');
    if(model.get('isDirty')) {
        model.deleteRecord(); // Updated based on MrVinz suggestion below
    }
}

我们过渡到的模板

<table class="table table-striped">
  <thead>
    <tr>
      ...
    </tr>
  </thead>
  <tbody>
    {{#each item in filteredItems itemController="cons"}} 
      ... (my unsaved items are showing up in here, and they should have been deleted) ...
    {{/each}}
  </tbody>
</table>

【问题讨论】:

  • 您能详细说明您遇到的工作流程和问题吗?您确定您对服务器的调用不会再次返回记录吗?
  • 能否请您向我们展示您正在转换到的模型/setupController 的最小/恢复实现,并可能向我们展示您如何声明/获取您的过滤项目 :)

标签: ember.js ember-data


【解决方案1】:

如果您在我认为model.destroyRecord() 不是最好的调用方法之前没有对您的记录进行model.save()。我最好选择 model.rollback() 或 model.deleteRecord()。

我相信因为createRecord 不会从您的商店触发任何服务器/api 调用 但是使用destroyRecord() 您实际上可能会执行不需要的服务器端服务器/api 调用(我没有检查destroyRecord() 但文档状态它在过程中执行了 model.save() :)

在 cmets 讨论后我进一步调查:

除非在 beta12 中更改实现,否则您不会在未保存的对象上使用 destroyRecord() 触发 API 调用。

然而

然后,您将处理一个承诺,并拥有一系列被调用的函数,它们都有成本(以资源为单位)。

【讨论】:

  • destroyRecord 调用deleteRecord 然后save。也许这就是你在这里说的,如果是这样,请随意忽略我的评论。
  • @Kingping2k 这正是我要说的
  • @Kingpin2k 或投票给我的人请证明我认为我的回答还不错。事实上:model.destroyRecord 会调用 model.save(),如果 ember 处理得当,后端不会被调用,否则后端可能会出错。即使 ember 正确管理了 model.destroyRecord 完成的保存调用,该操作仍然有成本并且在这种情况下是无用的。
  • destroyRecord 如果记录为root.deleted.save,则不会回调服务器,这是deleteRecord 放置新记录的状态。deleteRecordrollback 的新记录记录会将其置于该状态。如果您修改答案以反映这一点,我很乐意推翻我的投票,不幸的是,所有这三种方法都应该产生相同的结果,这意味着他的代码应该与每种方法相同。所以他的问题应该仍然存在是否使用deleteRecord/destroyReord/rollback
  • @Kingpin2k 已编辑,但是这 3 种方法是等效的,因为如果您执行 destroyRecord(),您仍然会处理承诺,这与其他两种方法相同。
【解决方案2】:

最终我的问题源于无意中弄乱了 ember-data 提供的 isDeleted 属性。我有以下内容:

isDrafted: Ember.computed.equal('status', 'Drafted'),
isSubmitted: Ember.computed.equal('status', 'Submitted'),
isValidated: Ember.computed.equal('status', 'Validated'),
isRecalled: Ember.computed.equal('status', 'Recalled'),
isReturned: Ember.computed.equal('status', 'Returned'),

我的状态之一是“已删除”,因此我定义了一个导致我所有问题的isDeleted。吸取的教训,也许我应该让我的计算属性更明确,比如isStatusDeletedisStatusDrafted

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 2015-06-27
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多