使用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()
,但它期望一系列屬性名稱,我沒有)任何其他相關建議?
這必須是比較新的,因爲我沒有在我的副本中的方法。這只是一個星期左右,但我一定會得到一個新的副本 - 最新,讓你知道,儘快。謝謝! – KOGI
啊。看起來'eachComputedProperty'確實存在於我的副本中,但出於某種原因在'DS.Model'的實例中不可用。根據代碼,DS.Model擴展了Ember.Object,所以它應該在那裏,但它不是。展望爲什麼現在。 – KOGI
也許我在看錯誤的東西,但[從我可以看到這裏](https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/store.js )DS.Store不擴展Ember.Object。看起來很瘋狂,所以我質疑我是否真的在看正確的事情。 – the0ther