Ember.js 余烬数据记录保存在本地存储中

Ember.js 余烬数据记录保存在本地存储中,ember.js,ember-data,Ember.js,Ember Data,我在灰烬1.8.1和灰烬数据测试版12 如果我执行createRecord,而用户选择不保存它,则在取消激活路由时,我将尝试执行model.destroyRecord(),但是,它在我的本地存储中仍然可用,并且具有currentState.stateName:root.deleted.saved 我似乎无法将它从本地商店中移除,我也不知道为什么。为什么记录的状态名为root.deleted.saved,在我执行存储时仍然可用。find 编辑: 我不知道这是否重要,但在取消并销毁记录(或尝试销毁)

我在灰烬1.8.1和灰烬数据测试版12

如果我执行createRecord,而用户选择不保存它,则在取消激活路由时,我将尝试执行model.destroyRecord(),但是,它在我的本地存储中仍然可用,并且具有currentState.stateName:root.deleted.saved

我似乎无法将它从本地商店中移除,我也不知道为什么。为什么记录的状态名为
root.deleted.saved
,在我执行
存储时仍然可用。find

编辑: 我不知道这是否重要,但在取消并销毁记录(或尝试销毁)后,我最终在一个位置使用了带有itemController的each。我想,我的古怪是从这一点开始的

// 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>

...
{{{#filteredItems itemController=“cons”}中的每个项
... (我的未保存项目显示在此处,它们应该已被删除)。。。
{{/每个}}

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

我之所以这么想,是因为
createRecord
不会从您的应用商店触发任何服务器/api调用,但使用
destroyRecord()
您实际上可能会执行一个不需要的服务器端服务器/api调用(我没有检查
destroyRecord()
的代码,但它在过程中的文档状态是model.save())

在我进一步调查的评论中进行讨论后:

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

但是


然后,您将处理一个承诺并拥有一个调用函数链,这两个函数都有成本(以资源为单位)。

最终,我的问题源于无意中弄乱了
isDeleted
ember数据提供的属性。我有以下几点:

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
。吸取的教训是,也许我应该让我的计算属性更明确,比如
isStatusDeleted
isStatusDrafted
,等等。你能详细说明一下工作流程和遇到的问题吗?您确定您对服务器的调用没有再次返回记录吗?请向我们展示您正在转换的model/setupController的最小/恢复的实现,并向我们展示您如何声明/获取您的filteredItems:)
destroyRecord
调用
deleteRecord
然后
保存
。也许这就是你在这里说的,如果是的话,请不要理会我的评论。@Kingping2k这正是我的本来面目saying@Kingpin2k或者那些投票否决我的人请证明,因为我认为我的答案没有那么糟糕。事实上:model.destroyRecord将调用model.save(),如果余烬正确处理后端将不会调用的内容,否则后端可能会引发错误。即使ember正确地管理model.destroyRecord完成的保存调用,该操作仍有成本,在这种情况下是无用的。
destroyRecord
如果记录是
root.deleted.save
,则不会回调服务器,这是
deleteRecord
将新记录放入的状态<新记录的code>deleteRecord
rollback
将使其处于该状态。如果你能修改你的答案来反映这一点,我会很高兴地推翻我的投票,不幸的是,这三种方法的结果应该是相同的,这意味着他的代码应该是相同的。因此,无论是否使用
deleteRecord
/
destroyrord
/
rollback
@Kingpin2k edited,他的问题仍然会发生,但是这三种方法是等价的,因为如果您使用destronRecord(),您仍然需要处理一个承诺,这两种方法都是如此。