12

Ember について非常に直感に反することは、計算されたプロパティ セッター関数 ( http://emberjs.com/#toc_computed-properties-setter ) を への引数で上書きできることcreate()です。http://jsfiddle.net/zJQJw/2/を参照してください

create().setProperties(properties)これに対する最善の回避策はの代わりにを呼び出すことであることがわかりましたが、これはcreate(properties)不必要な落とし穴のように思えます。この時点で一部のアプリが壊れる可能性があることは承知していますが、create()より のように動作させることを検討していただけますsetProperties()か?

これを求める動機は、パターンを使用するinit()前に呼び出されることです。これはまだ大きな問題ではありませんが、状況によっては望ましくないことがわかります。これは完全に不自然な例ですが、私が何をしようとしているのかわかるでしょうか? http://jsfiddle.net/QJ8vX/2/setProperties()create().setProperties(properties)

現在の動作を維持する唯一の理由は、setter メソッドのインスタンス固有のオーバーライドを行うことです。しかし、そのような場合は、同じように簡単に行うことができますMyClass.extend({ overridenMethod: ... }).create(properties)

このような変更は Ember 1.0 で考慮されますか? それとも、Ember のオブジェクト モデルがどのように機能するべきかについて間違った考えを持っているだけですか?

4

2 に答える 2

10

この変更を延期した主な理由は、基本クラスで計算されたプロパティとして定義されているプロパティをオーバーライドできなくなるためです。たとえば、Ember.Viewでは、templateプロパティは計算されたプロパティです。

template: Ember.computed(function(key, value) {
  if (value !== undefined) { return value; }

  var templateName = get(this, 'templateName'),
      template = this.templateForName(templateName, 'template');

  return template || get(this, 'defaultTemplate');
}).property('templateName').cacheable(),

のサブクラスを作成する場合、Ember.Viewこの定義を明示的なテンプレート関数でオーバーライドすることができます。

Ember.View.create({ template: Ember.Handlebars.compile('...') });

計算されたプロパティがセッターのケースを処理しない場合、計算されたプロパティをオーバーライドしようとすると、サイレント エラーが発生します。

この変更を行った場合、オブザーバーがcreateメソッドに渡されたプロパティをトリガーする必要があるかどうかについて、他の質問も発生します。どちらも実装可能であり、両方のアプローチには強力な議論があります。

1.0 に向けて、次のようなアプローチを検討するのが妥当と思われます。

  • セマンティクスcreateを使用するように変更setProperties
  • 既存の計算されたプロパティを明示的にオーバーライドしたい場合に備えて、既存のセマンティクスを保持する新しい API (overrideまたは) を追加します。createWithOverride
  • 原因で設定されたプロパティのオブザーバーを抑制しますcreate(またはそうしないことを決定します)
  • createセッターを実装していない計算されたプロパティで APIを使用しようとする試みを検出して警告する方法を見つけてください。

それについてもっと議論し、既存のアプリへの影響を検討する必要がありますが、新しい開発者にとってはかなり大きな落とし穴であることは間違いないので、検討する価値があることは間違いありません. 動作を変更する必要があったという事実ember-dataは、何かが正しくないというかなり良い手がかりです。

于 2012-07-18T01:44:35.857 に答える
4

汚いハックかもしれませんが、私にとってはうまくいきます。

Em.Object.reopenClass({ 
   create: function(config) {
       return this._super().setProperties(config); 
   }
});
于 2012-11-18T15:20:31.380 に答える