2013-01-16 29 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

相关问题