【问题标题】:deleteRecord doesn't update ArrayController when Model is filtered过滤模型时,deleteRecord 不会更新 ArrayController
【发布时间】:2013-06-29 17:42:47
【问题描述】:

我在一个带有ember-data(最新)、ember rc6 和股票 REST 控制器的应用程序中使用了一个简单的Ember.ArrayController

我在数组控制器呈现的列表中的每个项目旁边都有删除操作。删除项目时,会进行正确的 REST API 调用,并将其从数据库中正确删除。服务器响应正确的204 响应。

这是我的路由器设置,请注意正在应用的查找过滤器

App.CategoriesIndexRoute = Ember.Route.extend({
    setupController : function(controller, model) {
        this._super(controller, model);

        controller.set("content", App.Category.find({
            "parent": null,
        }));
    }
});

如果我删除查找过滤器并加载所有类别,一切正常(项目在提交后立即自动从列表中删除)。但是,当我添加过滤器以仅显示没有父项的类别时,删除项目时列表不会更新。如果我切换到另一个部分并返回,则重新加载列表并且类别消失。

这里是ArrayController中的deleteCategory方法:

deleteCategory: function(category) {
    var transaction = this.get("store").transaction();

    transaction.add(category);
    category.deleteRecord();
    transaction.commit();
}

这是 ember-dataemberjs 错误吗?如果没有,我在这里做错了什么?如果这是一个错误,有没有办法在我删除一个项目后强制重新加载 ArrayController 内容?或者,我可以手动从 ArrayController 中删除类别吗?

更新 1:

我设法通过设置它的内容来强制更新数组控制器的内容:

category.one("didDelete", this, function() {
    this.set("content", App.Category.find({
        parent: parent_category
    }));
});

更新 2:

这是我在模板中显示项目列表的方式:

{{#each category in controller.content }}
<tr>
    <td><a {{ action "detailCategory" category }}>{{ category.name }}</a></td>
    <td><a {{ action "deleteCategory" category }}>Delete</a></td>
</tr>
{{/each}}

谢谢!

【问题讨论】:

  • 两个注意事项:我用其他类型的过滤器对此进行了测试,如果将任何过滤器应用于模型查询,它就会失败。它只适用于没有过滤器的情况,否则列表不会更新。我还找到了一种通过在删除完成后设置其内容来强制重新加载 ArrayController 查询的方法。现在可以这样做,但这是一个讨厌的 hack。
  • 我遇到了类似的问题。你解决过这个问题吗?
  • 我最终将此问题追溯到列表中每个项目旁边的复选框。每个复选框都绑定到相关对象的属性,并且在加载列表时触发错误事件,从而导致此问题。我最终删除了与它们相关的复选框和事件以解决问题。如果您需要更多详细信息,我会进一步挖掘并让您知道。
  • 您能否详细说明您是如何跟踪该问题的?我遇到了类似的问题(删除记录后视图仍然存在),但我不知道如何跟踪问题。
  • @Nico 我猜这与数据绑定有关,所以我开始逐步删除我能想到的所有绑定。由于这是一个列表视图,因此没有太多要测试的内容。删除复选框后,一切都开始正常工作。作为记录,在遇到许多此类问题后,我们离开了 Ember.js。这是一个不稳定且设计不佳的框架。就稳定性和可用性而言,它甚至无法与 Angular.js 相提并论。

标签: ember.js ember-data


【解决方案1】:

这不再是在 Ember Data 中做事的方式。一个人将不再使用事务,可以在转换文档中看到:https://github.com/emberjs/data/blob/master/TRANSITION.md

【讨论】:

  • 我已经删除了我的问题,我不能接受你的问题,因为我不是提出问题的人 :) 你应该给 Taylan Pince 一个问题 ...
  • 是的,如果我正确理解堆栈溢出,每条评论都会“破坏”OP...我不确定您指的是什么问题,抱歉,但一切都很好:) 堆栈溢出是如果你想清除旧的东西很烦人,我发现了。 “已回答”的意思是“已回答并接受该回答”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多