ember-cli中具有多个belongsTo关系的deleteRecord [英] deleteRecord with multiple belongsTo relationships in ember-cli

查看:91
本文介绍了ember-cli中具有多个belongsTo关系的deleteRecord的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在属于多个模型的模型上删除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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆