【问题标题】:How do I get a list of all computed properties?如何获取所有计算属性的列表?
【发布时间】:2013-01-17 11:49:08
【问题描述】:

使用 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(),但它需要一个属性名称数组,而我没有)

  • 还有其他相关建议吗?

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    我没试过,但是eachComputedProperty 适合你的目的吗?

    【讨论】:

    • 那一定是比较新的,因为我的副本中没有那个方法。才一个星期左右,但我一定会得到一份新的 -latest 并尽快让你知道。谢谢!
    • 啊。我的副本中似乎确实存在eachComputedProperty,但由于某种原因在DS.Model 的实例上不可用。根据代码,DS.Model 扩展了 Ember.Object,所以它应该存在,但事实并非如此。现在调查原因。
    • 也许我看错了,但from what I can see here DS.Store 没有扩展 Ember.Object。看起来很疯狂,所以我怀疑我是否真的在寻找正确的东西。
    • 不,我说DS.Model 扩展了Ember.Object。但是使用DS.Model.createRecord() 只是DS.Store.createRecord 的包装器,它返回一个没有eachComputedProperty 方法的记录对象:(
    • 2.5 个月后回到这个问题,我现在意识到我原来的问题只是一个愚蠢的问题。在任何其他情况下,这可能是正确的解决方案。
    猜你喜欢
    • 2013-03-19
    • 2019-01-12
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多