ember-data与EmbeddedRecordsMixin的一对多关系,不保存create上的单个记录

时间:2014-10-07 02:31:55

标签: serialization ember.js ember-data

我有两个模型组织和网站如下:

站点:

export default DS.Model.extend({
  ...,
  organization: DS.belongsTo('organization',{async:true}),
  administration: DS.attr('boolean',{defaultValue: false}),
  users: DS.hasMany('user',{async:true}),
  totalUsers: function() {
    return this.get('users').get('length');
  }.property('users.@each')
});

组织:

export default DS.Model.extend({
  ...,
  sites: DS.hasMany('site',{async:true}),
  totalSites: function() {
    return this.get('sites').get('length');
  }.property('sites.@each'),
  type: DS.attr('string')
});

每个组织都有许多站点,但这些站点有一个组织。我之前使用过应用程序序列化程序here,但它已停止使用ember-data 1.0.0 beta 10.所以我转到了embeddedrecords mixin和单独的序列化程序,如下所示

组织序列化器:

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    sites: {serialize: 'ids', deserialize: 'ids'}
  }
});

然后在控制器上我能够创建新的站点记录并将新站点记录推送到组织中,但我的问题是组织没有保存到原始站点记录中。我的新网站控制器操作如下:

  actions: {
    addSite: function() {
      var self = this;
      var newSite = this.store.createRecord('site', {
        name: this.get('name'),
        abbreviation: this.get('abbreviation'),
        address: this.get('address'),
        city: this.get('city'),
        state: this.get('state'),
        postalcode: this.get('postalcode'),
        country: this.get('country'),
        phone: this.get('phone'),
        mingrade: this.get('mingrade'),
        maxgrade: this.get('maxgrade'),
        organization: self.get('selectedOrg'),
        administration: this.get('administration')
      });
      newSite.save().then(function(ns) {
        self.get('selectedOrg.sites').then(function() {
          self.get('selectedOrg.sites').addObject(ns).then(function() {
            self.get('selectedOrg').save().then(function() {
              self.transitionToRoute('site', ns);
            });
          });
        });
      });
    }
  }

什么可能导致组织不保存,我知道数据存在?如果我将组织上的belongsTo从异步更改为非,则会保存,但会导致应用程序中其他位置的查找出现问题。我能做些什么来保存,同时也是异步。我是否需要在网站序列化程序中添加其他内容?我尝试在组织器中添加一个组织器,似乎没有任何改变。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

addObject没有回复承诺,当您尝试将其链接起来时,您的代码可能会爆炸。

self.get('selectedOrg.sites').then(function() {
  self.get('selectedOrg.sites').addObject(ns).then(function() {
    self.get('selectedOrg').save().then(function() {
      self.transitionToRoute('site', ns);
    });
  });
});

尝试这样的事情:

var selectedOrg = self.get('selectedOrg');
selectedOrg.get('sites').then(function(sites) {
  sites.addObject(ns);
  selectedOrg.save().then(function() {
    self.transitionToRoute('site', ns);    
  });
});

selectedOrg已有ID,对吗?如果没有,您可能会遇到此问题:github.com/emberjs/data/issues/1542#issuecomment-56237770。但是,由于您在创建时设置它,它应该与Ember Data的canary版本一起使用。

如果selectedOrg没有ID,则需要先保存。