ember.js 试图在根状态下处理〈appname@model:post::ember 622:17>上的'pushedData'事件,已删除,inFlight

l0oc07j2  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个基本的博客文章的crud应用程序。上面的错误显示在控制台。在我删除后的文章。但文章被从数据库中删除。我搜索了类似的问题,但没有一个答案解决了这个问题。我使用JSONAPIAdapter的crud操作。
我检查了成员检查器中的标志,isDeleted的标志设置为true。仅供参考,* 成员数据 * 中显示的记录的数量是精确的。

deletePost:function(id){
  var self = this;
  this.get('store').find('post', id)
    .then(post => post.destroyRecord())
      .then(() => self.transitionToRoute('posts'));
}

我使用nodejs作为后端,mysql作为数据库。删除记录后,我发送如下响应:res.status(204).end();

Ember CLI版本2.6.3

图片中的以上细节是来自服务器的响应。

kmbjn2e3

kmbjn2e31#

我非常肯定这个问题是由ember数据的后台重新加载引起的。即使对api的find请求在delete请求之前触发,在您触发了删除请求之后,查找请求正在解析。要禁用后台重新加载并强制执行API调用,您可以将{reload: true}传递给findRecord()调用。这将确保在触发删除请求之前解析查找请求。
就像这样:

deletePost(id) {
  this.get('store').findRecord('post', id, { reload: true }).then((post) => { 
    return post.destroyRecord();
  }).then(() => {
    self.transitionToRoute('posts');
  });
}

您可以在此处阅读有关findRecord的更多信息:http://emberjs.com/api/data/classes/DS.Store.html#method_findRecord
在未来,我建议不要使用箭头函数的简写,因为它总是会返回,即使你不想返回值。

ryoqjall

ryoqjall2#

我已经来过这里几次了,我找到了一个更好的解决方案here。他们推荐的方法是使用peekRecord而不是findRecord(假设商品已经在商店中),这将是同步的。下面的代码:

// get the comment from the store synchronously, without triggering a fetch
let comment = store.peekRecord("comment", commentId);

// check if there is a comment; is null in the case the store has no comment 
with the given id
if (comment) {
    comment.destroyRecord(...);
}

这对我很有效,而{reload: true}没有。

相关问题