【发布时间】: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-data 或 emberjs 错误吗?如果没有,我在这里做错了什么?如果这是一个错误,有没有办法在我删除一个项目后强制重新加载 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