4

残り火のデータを使用して、計算されたプロパティがペイロードに含まれていないシリアル化中に問題が発生しました。

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()たが、それも役に立たなかったようです。

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()が、私が持っていないプロパティ名の配列を期待しています)

  • 他に関連する提案はありますか?

4

1 に答える 1

1

私は試していませんが、eachComputedPropertyはあなたの目的に合っていますか?

于 2013-01-17T03:49:08.733 に答える