3

ビューでモデルの becomeInvalid イベントと becomeError イベントをサブスクライブして、エラー状態を設定できるようにしたいと考えています。2 つの方法が考えられますが、どちらにも欠点があります。

私が考えることができる最初の方法は、オブザーバーを使用して、ビューに独自の becomeInvalid および becomeError フックを作成することです。

becameInvalid: function() {
  var isValid = this.get('controller.model.isValid');
  if (Ember.isNone(isValid) || isValid) {
    return;
  }
  console.log('becameInvalid');
}.observes('controller.model.isValid')

becameError: function() {
  var isError = this.get('controller.model.isError');
  if (Ember.isNone(isError) || !isError) {
    return;
  }
  console.log('becameError');
}.observes('controller.model.isError')

これは機能しますが、多くのボイラープレート コードを使用します。私が考えることができる 2 番目の方法は、モデルが読み込まれた後にイベントにハンドラーを追加することです。

didLoad: function() {
  var isLoaded = this.get('controller.model.isLoaded');
  if (Ember.isNone(isLoaded) || !isLoaded) {
    return;
  }
  var model = this.get('controller.model');
  model.on('becameInvalid', function() {
    console.log('becameInvalid');
  });
  model.on('becameError', function() {
    console.log('becameError');
  });
}.observes('controller.model.isLoaded')

このアプローチの問題点は、まだいくつかのボイラープレート コードが必要なことと (間違っていたら訂正してください)、ビューが削除されたときにイベント ハンドラーが自動的にクリーンアップされないことです。

私がやりたいことは、フレームワークによって自動的にクリーンアップされるイベントのオブザーバー プロトコルに似たものです。例えば:

becameInvalid: function() {
  console.log('becameInvalid');
}.eventHandler('controller.model.becameInvalid')

becameError: function() {
  console.log('becameError');
}.eventHandler('controller.model.becameError')

このようなものは存在しますか?

4

1 に答える 1

0

あなたの最初の提案は実行可能な解決策だと思います。これは、少し冗長なバージョンです。

isValid : Ember.Computed.alias("controller.model.isValid"),
becameInvalid: function() {
  if(this.get("isValid"){
     return;
  }
  console.log('becameInvalid');
}.observes('isValid')

Ember.computed.alias の詳細については、この質問を参照してください。それとは別に、すぐに使える機能である Ember を使用して、特定の状況下 (= isValid が false になったとき) だけでオブザーバーをトリガーする可能性は見つかりませんでした。そのようなオブザーバーを自分で実装する必要があります。

于 2013-02-19T23:42:58.973 に答える