Ember.js deleteRecord不会从hasMany中删除记录
当我对一些hasMany关系调用Ember.js deleteRecord不会从hasMany中删除记录,ember.js,ember-data,Ember.js,Ember Data,当我对一些hasMany关系调用deleteRecord()时,余烬数据会发送一个(成功的)DELETE请求,但该记录不会从视图中删除。我使用render辅助工具显示它,如下所示: {{render "modules.list" modules}} 有趣的是,Ember Inspector显示在deleteRecord()之后,相应的对象是,其父对象也是null。但是,它的父级仍然在其hasMany(如)中显示记录。当我重新加载页面,然后调用deleteRecord(),它将按预期从视图中删除
deleteRecord()
时,余烬数据会发送一个(成功的)DELETE
请求,但该记录不会从视图中删除。我使用render
辅助工具显示它,如下所示:
{{render "modules.list" modules}}
有趣的是,Ember Inspector显示在deleteRecord()
之后,相应的对象是
,其父对象也是null
。但是,它的父级仍然在其hasMany
(如
)中显示记录。当我重新加载页面,然后调用deleteRecord()
,它将按预期从视图中删除
似乎deleteRecord()
没有从父级的hasMany
数组中删除记录。奇怪的是,这在我的代码的其他部分工作得很好。我的一个理论是,这与{render}
助手有关,因为无论我在哪里使用它,我都有相同的问题,但我不确定这是否是导致问题的原因
我使用的是最新版本的余烬数据(
commit 2511cb1f77
)。下面是一个正在运行的JSBin,演示了删除项目的一般思路:
你能举一个给你带来问题的例子吗?我找到了解决办法。似乎
deleteRecord
调用clearRelationships
,从而将模型的belongsTo
设置为null
。但是,它没有清除反向(即,它没有从父对象的hasMany
关系中删除模型)。下面的代码修复了它
var model = this.get('model');
model.eachRelationship(function(name, relationship){
if (relationship.kind === "belongsTo") {
var inverse = relationship.parentType.inverseFor(name);
var parent = model.get(name);
if (inverse && parent) parent.get(inverse.name).removeObject(model);
}
});
this.get('model').deleteRecord();
this.get('model').save();
然而,在我看来,这应该由EMBE(数据)处理。看起来是这样(大多数时候),因为这在我的代码的其他部分工作得很好。因此,这种情况很可能是某种边缘情况。任何关于可能发生的事情的想法都非常感谢 似乎在
belongsTo
关系中设置inverse
参数可以修复它,而无需在余烬数据0.14中手动清理关系
App.Item = DS.Model.Extend({
parent: belongsTo('parent', { inverse: 'items' })
});
因此,如果通过其父模型实例化子模型,如下所示:
App.ParentController = Ember.ObjectController.extend({
actions: {
add: function() {
this.get('items').pushObject(this.store.createRecord('item'));
}
}
});
对已创建的
项
删除记录
实例方法的任何进一步调用都会将其从父关系中删除,并将其正确地从视图中删除。谢谢Jeremy,但我对删除记录的工作原理非常熟悉。事实上,我的设置与你发布的非常相似。不幸的是,由于我的案例涉及到与后端的通信,所以我没有好的方法来整理小提琴。以上是我能给出的最好的描述。在我的例子中,记录似乎没有从父hasMany数组中删除。目前我甚至不知道如何缩小问题的范围。任何关于这方面的建议都会很好!我不熟悉余烬数据,但在调用removeObject后必须保存父对象@斩波器这是必要的吗?最好的猜测是你有两个潜在的反向关系,所以余烬不知道从哪个删除它。。。不过,在这种情况下,由于您正在删除它,理想情况下应该将其从所有中删除。当我迁移到ember cli时,此解决方案不再适用于我,因此我在这里提出了另一个问题:这个答案仍然是我应该尝试的方法吗?谢谢