对于属于多个模型的模型,deleteRecord()的ember-cli最佳实践是什么?我是否必须手动清理父母的关系?
从ember迁移到ember-cli我正在使用deleteRecord()为一个模型' star'属于多个模型,' post'和'用户'。在迁移到ember cli之前,它正在使用this solution。
The previous solution's删除操作在当前的ember-cli中失败并且从不调用api 。第{
>行TypeError: Cannot read property 'modelFor' of undefined
和Uncaught Error: Assertion Failed: TypeError: Cannot read property 'modelFor' of undefined
var inverse = relationship.parentType.inverseFor(name);
// name is the string 'post'
现在我再次开始简单。以下是我尝试的一个简单示例。也许我错过了es6,明确的反转或使用needs:
?
http://localhost:4200/post/1
模型
// 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
控制器操作重新:@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);
}
有趣的是,我发现如果我添加一个星星,重新加载页面,然后将其删除,该星星已成功从帖子中删除。太好了!
但是如果我添加一个星并在不重新加载的情况下删除它,那么仍然会有一个对已移除的星的引用,其中id
位于帖子的星星中。查看在控制台中,已移除的星形对象仍会被帖子及其id
引用,但user
和post
属性为undefined
。
答案 0 :(得分:0)
stars
是user
的异步属性。因此,当你有:
var filtered = self.get('stars').filterProperty('user.id', user.id);
var star = filtered[0];
star.deleteRecord();
star.save();
filtered
可能是一个承诺,因此可能无法按预期工作。另外,我对filterProperty不太熟悉,但你没有一个名为user.id
的属性,所以看起来这可能会返回一个空列表?
答案 1 :(得分:0)
现在我非常谨慎地清理父母的关系。这有效,但并不理想。
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);
}