2014-10-07 37 views
0

我有以下燼型號:堅持燼模型的嵌入式記錄

App.Location = DS.Model.extend({ 
    street: DS.attr('string'), 
    city: DS.attr('string'), 
    area: DS.attr('string'), 
    lat: DS.attr('string'), 
    lng: DS.attr('string'), 
    report: DS.belongsTo('report', {embedded: 'always'}) 
}); 

App.Report = DS.Model.extend({ 
    title: DS.attr('string'), 
    description: DS.attr('string'), 
    reg_num: DS.attr('string'), 
    location_str: DS.attr('string'), 
    location: DS.belongsTo('location', {embedded: 'always'}) 
}); 

App.ReportController,當我嘗試保存的報告我也想嵌入請求負載的位置對象。到目前爲止,我嘗試下面的代碼:

App.ReportController = Ember.ObjectController.extend({ 
    actions: { 
     saveReport: function(record) { 
      var self = this, 
       report = this.get('model'), 
       location = this.store.createRecord('location', { 
           lat: this.get('lat'), 
           lng: this.get('lng') 
          }); 
       report.set('location', location); 
       report.save().then(function (result) { 
        self.transitionToRoute('list'); 
       }); 
      } 
     } 
    } 
}); 

然而,在請求負載位置始終location: null

如何將location添加到請求負載?

+0

什麼版本的燼數據和你使用什麼串行器? – Microfed 2014-10-07 10:06:05

+0

DEBUG:Ember數據:1.0.0-beta.7.f87cba88 – 2014-10-07 18:11:43

回答

1

也許我'失去了一些東西,但我知道處理的嵌入式記錄兩種不同的方式(燼數據> = 1.0.0-β):

  1. Rewriting DS.Adapter's methods:串行/提取* /規範和其他人, - 以Ember可以使用的方式設置JSON負載。
  2. 使用DS.EmbeddedRecordsMixin來配置DS.Serializer。

我可以假設你是因爲default DS.Serializer's behavior with serializing relationshipslocation: null:灰燼預計idbelongTo財產和ID列表中hasMany屬性。 LocationModel在創建之後和保存到服務器數據庫之前沒有id。當默認序列化程序試圖在保存ReportModel並附加新創建的LocationModel時形成傳出json有效內容時,它將獲取標識LocationModelnull)並將該標識置於location屬性中。

+1

謝謝,我不得不重寫DS.JSONSerializer並使用DS.EmbeddedRecordsMixin配置來實現此功能。我會發布完整的答案。 – 2014-10-08 05:45:27

0

將複合JavaScript對象放在有效載荷中不應該是火箭科學,我希望實現這一點的方法不那麼複雜。

確保你沒有兩個關係定義belongsTo,因爲你將最終堆棧溢出:

App.Location = DS.Model.extend({ 
    street: DS.attr('string'), 
    city: DS.attr('string'), 
    area: DS.attr('string'), 
    lat: DS.attr('string'), 
    lng: DS.attr('string') 
}); 

App.Report = DS.Model.extend({ 
    title: DS.attr('string'), 
    description: DS.attr('string'), 
    reg_num: DS.attr('string'), 
    location_str: DS.attr('string'), 
    location: DS.belongsTo('location', {embedded: 'always'}) 
}); 

我不得不配置PostSerializer並覆蓋serializeBelongsTo,使這項工作

App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
     location: {embedded: 'always'}, 
     report: {embedded: 'always'} 
    } 
}); 

DS.JSONSerializer.reopen({ 
    serializeBelongsTo: function(record, json, relationship) { 
     var key = relationship.key, 
      belongsToRecord = Ember.get(record, key); 

     if (relationship.options.embedded === 'always') { 
      json[key] = belongsToRecord.serialize(); 
     } else { 
      return this._super(record, json, relationship); 
     } 
    } 
});