【问题标题】:deleteRecord with multiple belongsTo relationships in ember-cli在 ember-cli 中删除具有多个 belongsTo 关系的记录
【发布时间】: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 中失败并出现错误并且从不调用 apiTypeError: 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

模型

// 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

【问题讨论】:

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


    【解决方案1】:

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

    var filtered = self.get('stars').filterProperty('user.id', user.id);
    var star = filtered[0];
    
    star.deleteRecord();
    star.save();
    

    filtered 可能是一个承诺,所以这可能无法按预期工作。另外,我对 filterProperty 不太熟悉,但是您没有名为 user.id 的属性,所以看起来可能会返回一个空列表?

    【讨论】:

    【解决方案2】:

    现在我正在非常手动地清理父母的关系。这可行,但并不理想。

    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 知道在删除记录时自动删除关系,那就太棒了。
    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多