使用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