2013-01-16 60 views
4

使用ember數據時,我在序列化期間運行了一個問題,其中計算的屬性未包含在有效內容中。如何獲得所有計算屬性的列表?

var Person = DS.Model.extend({ 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    fullName: function() { 
      return this.firstName + this.lastName; 
    }.property() 
}); 

App.store.createRecord(Person, { 
    firstName: 'John', 
    lastName: 'Doe' 
}); 
App.store.commit(); 

結果在以下有效載荷:

{ firstName: "John", 
    lastName: "Doe" } 

我嘗試添加.cacheable()的財產,但它似乎並沒有幫助。我也嘗試在Ember.computed()中包裝整個fullName函數,但這似乎也沒有幫助。

追蹤Ember代碼,我看到請求的數據來自DS.Model.serialize(),它收集模型的所有屬性。但是,它似乎沒有收集計算的屬性。

灰燼代碼段:

serialize: function(record, options) { 
    options = options || {}; 

    var serialized = this.createSerializedForm(), id; 

    if (options.includeId) { 
    if (id = get(record, 'id')) { 
     this._addId(serialized, record.constructor, id); 
    } 
    } 

    this.addAttributes(serialized, record); 
    this.addRelationships(serialized, record); 

    return serialized; 
}, 

addAttributes: function(data, record) { 
    record.eachAttribute(function(name, attribute) { 
    this._addAttribute(data, record, name, attribute.type); 
    }, this); 
} 

正如你所看到的,他們收集的屬性和關係,但似乎沒有任何東西收集計算性能。我的策略首先是重載addAttributes()以循環所有計算的屬性並將它們添加到列表中。但在我的嘗試中,找不到一個可靠的方法來獲得計算屬性的列表。如果我使屬性可緩存,我可以使用Ember.meta(model, 'cache'),但該列表包含所有屬性,計算屬性以及一些我不需要的額外內容。

所以,我的問題,畢竟這...

  • 是否有灰燼的方式,已經存在導致計算將包含在序列化的屬性?

  • 如果不是,我可以重載適當的方法,但是如何獲得所有計算屬性的動態列表? (我可以使用.getProperties(),但它期望一系列屬性名稱,我沒有)

  • 任何其他相關建議?

回答

1

我還沒試過,但是​​是否適合您的用途?

+0

這必須是比較新的,因爲我沒有在我的副本中的方法。這只是一個星期左右,但我一定會得到一個新的副本 - 最新,讓你知道,儘快。謝謝! – KOGI

+0

啊。看起來'eachComputedProperty'確實存在於我的副本中,但出於某種原因在'DS.Model'的實例中不可用。根據代碼,DS.Model擴展了Ember.Object,所以它應該在那裏,但它不是。展望爲什麼現在。 – KOGI

+0

也許我在看錯誤的東西,但[從我可以看到這裏](https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/store.js )DS.Store不擴展Ember.Object。看起來很瘋狂,所以我質疑我是否真的在看正確的事情。 – the0ther

相關問題