【问题标题】:List not updated after deleteRecord删除记录后列表未更新
【发布时间】:2013-01-13 12:24:30
【问题描述】:

我有一个 ArrayController,它的内容是在这样的路由中定义的:

App.UsersRoute = Ember.Route.extend({
  model: function() {
    return App.User.find();
  },

  setupController: function(controller, model) {
    this._super(controller, model);
    this.controllerFor('application').set('currentRoute', 'users');
  }
});

我在模板中列出数据:

<ul>
  {{#each user in arrangedContent}}
  <li>
    {{user.lastName}} {{user.firstName}}
    {{#linkTo "users.edit" user class="btn btn-primary btn-small"}}EDIT{{/linkTo}}
  </li>
  {{/each}}
</ul>

效果很好。

如果我创建一个新项目,它会自动添加到模板中的列表中:

App.UsersNewRoute = Ember.Route.extend({
  model: function() {
    return App.User.createRecord({firstName: '', lastName: ''});
  }
});

但是当我在“编辑”视图中删除一个项目时,它不起作用:

App.UsersEditController = Ember.ObjectController.extend({
  ...

  destroy: function() {
    this.get('content').deleteRecord();
    this.get('store').commit();
    this.transitionToRoute("users.index");
  }
});

但是在“新”视图中,如果我删除新创建的项目,它会起作用(没有提交)。

在编辑控制器中,如果我删除“提交”,列表会更新,但是当我执行另一个操作时,列表会重新加载,并且删除的项目会重新出现(正常)。

那么,如何删除一个项目?

注意:我使用的是 ember 和 ember-data 的“主”代码,刚刚刷新。

【问题讨论】:

  • 我已经遇到过同样的问题。我想如果你刷新页面,被删除的项目就不在这里了?但是,在提交期间,是否有任何服务器响应仍包含此记录?
  • 是的!这是错误。在 Rails 服务器中,我用“render json: user”返回了被破坏的对象。使用“render json: nil, status: :ok”,没关系!非常感谢。
  • 很好:),这确实是一个很难跟踪的错误。如果您同时创建/删除一个子项并修改父项,则可能会出现相同的行为。(在 hasMany/belongs 的情况下)2 个请求转到服务器,但父项修改在子项删除之前运行。结果,对于 Ember-data,当父响应到来时,它总是有子...繁荣...
  • 您能否更新此问题,使其不再显示为“未回答”?

标签: ember.js ember-data


【解决方案1】:

我刚刚在完全不同的情况下遇到了类似的问题。

我正在使用“grunt-ember-boilerplate”(如果您喜欢 CoffeeScript 和 Ember,强烈推荐)。它附带的 Ember Data 版本有一个奇怪的错误,即正确删除的记录会保留在缓存中,因此不会从列表中删除。

我没有时间弄清楚到底发生了什么;所以我只是尝试获取最新版本的 Ember Data (2013-05-10 10:20:34 -0700) 并立即解决了问题。

只是在这里发布以防其他人遇到类似问题。

另外,我同意 Jakub Arnold 关于不提交“存储”和使用事件侦听器来确保干净状态的说法。就在今天,我发现了一篇关于这个主题的非常有用的博客文章,“Patterns and anti-patterns for Ember Data”。

【讨论】:

    【解决方案2】:

    你也应该只在记录被删除后才转换,因为提交是异步发生的。

    var user = this.get("content");
    
    user.one("didDelete", this, function() {
      this.transitionTo("users.index");
    });
    
    user.deleteRecord();
    user.get("transaction").commit();
    

    另请注意,提交交易优于提交商店。如果您稍后决定将记录添加到它自己的事务中,您将有更少的工作要做,如果您不这样做,它仍将使用与提交存储相同的defaultTransaction

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 2017-09-28
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      相关资源
      最近更新 更多