【发布时间】:2014-07-09 03:24:32
【问题描述】:
在一个属于多个模型的模型上删除记录()的 ember-cli 最佳实践是什么?我必须手动清理父母的关系吗?
从 ember 迁移到 ember-cli 我在 deleteRecord() 中遇到了新问题,因为它属于多个模型“post”和“user”的模型“star”。在迁移到 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。
【问题讨论】:
标签: ember.js ember-data has-many belongs-to ember-cli