ember-cli中具有多个belongsTo关系的deleteRecord [英] deleteRecord with multiple belongsTo relationships in ember-cli
问题描述
在属于多个模型的模型上删除deleteRecord()的ember-cli最佳实践是什么?我必须手动清理与父母之间的关系吗?
从ember迁移到ember-cli我对模型的deleteRecord()遇到了新麻烦属于多个模型的星级,即发布和用户。在转到灰烬之前,它正在使用此解决方案。
Migrating from ember to ember-cli I am having new trouble with deleteRecord() for a model 'star' that belongsTo multiple models, 'post' and 'user'. Before moving to ember cli it was working with this solution.
先前解决方案的 删除操作在当前的ember-cli中失败,并显示错误,并且从不调用api 。 TypeError:无法读取未定义的属性'modelFor'
和未捕获的错误:断言失败:TypeError:无法读取未定义的属性'modelFor'
行中
var inverse = relationship.parentType.inverseFor(name);
// name is the string 'post'
现在我要开始再次简单。这是我正在尝试的简单示例。也许我缺少es6,显式逆或使用需求的东西:
?
Now I'm starting simple again. Here is a simple example of what I'm trying. Maybe I am missing something with es6, explicit inverses, or using needs:
?
http:// localhost:4200 / post / 1
models
// models/star.js
import DS from 'ember-data';
export default DS.Model.extend({
created: DS.attr('date'),
post: DS.belongsTo('post', {
async: true,
inverse: 'stars'
}),
user: DS.belongsTo('user', {
async: true,
inverse: 'stars'
})
});
// models/post.js
import DS from 'ember-data';
export default DS.Model.extend({
headline: DS.attr(),
body: DS.attr(),
stars: DS.hasMany('star', { async: true })
});
// models/users.js
import DS from 'ember-data';
export default DS.Model.extend({
username: DS.attr(),
stars: DS.hasMany('star', { async: true })
});
控制器
//controllers/post.js
import Ember from 'ember';
export default Ember.ObjectController.extend({
actions: {
createStar: function(){
var self=this,
post = this.get('model'),
user = this.store.find('user', 2),
star;
user.then( function(user){
star = self.get('store').createRecord('star', {
post: post,
user: user
});
star.save().then( function(star){
post.get('stars').then( function(stars){
stars.pushObject(star);
});
user.get('stars').then( function(stars){
stars.pushObject(star);
});
});
});
},
deleteStar: function() {
var user = this.store.find('user', 2),
self = this;
user.then( function(user){
var filtered = self.get('stars').filterProperty('user.id', user.id);
var star = filtered[0];
star.deleteRecord();
star.save();
});
return(false);
}
}
});
更新:备用 deleteStar
post
控制器操作re:@jjwon
Update: Alternate deleteStar
post
controller action re: @jjwon
deleteStar: function() {
var user = this.store.find('user', 2),
self = this;
user.then( function(user){
var stars = self.get('stars').then( function(items){
// log the post's stars before delete
items.forEach(function(item) {
console.log(item);
});
var filtered = items.filterBy('user.id', user.id);
var star = filtered.get('firstObject');
star.deleteRecord();
star.save().then(function(){
// log the post's stars after delete
items.forEach(function(item) {
console.log(item);
});
});
});
});
return(false);
}
有趣的是,我发现如果添加星标,请重新加载页面,然后删除表示该星标已成功从帖子的星标中删除。
Interestingly I found that if I add a star, reload the page, then delete it, that the star is successfully removed from the post's stars. Great!
但是,如果我添加一颗恒星并在不重新加载的情况下将其删除,仍然会引用带有 id的已删除恒星
在帖子的星星中。在控制台中,该帖子仍使用其 id
引用已删除的星星对象,但是 user
和 post
属性是 undefined
。
But if I add a star and remove it without reloading, there is still a reference to the removed star with its id
among the post's stars. Looking in the console, the removed star object is still referenced by the post with its id
, but the user
and post
attributes are undefined
.
推荐答案
现在,我非常手动地清理父母之间的关系。
For now I'm cleaning up the relationships on the parents very manually. This works but isn't ideal.
deleteStar: function() {
var user = this.store.find('user', 2),
self = this;
user.then( function(user){
var star = self.get('stars').filterBy('user.id', user.id).get('firstObject');
// clean up relationships on parents very manually
// user.stars
user.get('stars').removeObject(star);
// posts.stars
self.get('stars').removeObject(star);
star.deleteRecord();
star.save();
});
return(false);
}
这篇关于ember-cli中具有多个belongsTo关系的deleteRecord的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!