使用 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()
到该属性,但它似乎没有帮助。我也尝试将整个fullName
函数包装在 中Ember.computed()
,但这似乎也没有帮助。
跟踪 Ember 代码,我看到请求的数据来自DS.Model.serialize()
收集模型的所有属性。但是,它似乎没有收集计算属性。
Ember 代码片段:
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' )
,但该列表包括所有属性、计算属性和一些我不需要/不想要的额外内容。
所以,在这一切之后我的问题......
Ember 中是否已经存在一种方法可以使计算属性包含在序列化中?
如果没有,我可以重载适当的方法,但是如何获得所有计算属性的动态列表?(我可以使用
.getProperties()
,但它需要一组属性名称,而我没有)还有其他相关建议吗?