deleteRecord在ember-cli中有多个belongsTo关系

时间:2014-07-09 03:24:33

标签: ember.js ember-data has-many belongs-to ember-cli

对于属于多个模型的模型,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 undefinedUncaught 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

deleteRecord() on child model not cleaning parent relations

模型

// 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引用,但userpost属性为undefined

2 个答案:

答案 0 :(得分:0)

starsuser的异步属性。因此,当你有:

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);
}