2012-05-03 12 views
2

オブジェクトのプロパティまたはプロパティの通知を一時的に無効にする簡単な方法はありますか?Emberjs - 一時的にプロパティの変更を無効にする通知

beginPropertyChanges()endPropertyChanges()でそれらを延期することができますが、明示的に有効にするまでこれらの変更が一切通知されないようにしたいと思います。

ありがとうございます。

ユースケース: 私は別のオブジェクト(B)とオブジェクト(A)のプロパティを設定する必要があります。 Bのプロパティは、他のオブジェクトのいくつかのメソッドによって観察されています。ある時点で、Bオブジェクトのデータはクリアされ、オブザーバーに通知されます。後で、HTTP応答によって有用なものが設定されます。プロパティ値がその時点で有効ではないため、オブジェクトをクリアするときにオブザーバに通知する必要はありません。

+0

はあなたが具体的な例を与えることができますか?あなたの特定のユースケースは何ですか? – pangratz

+0

私はそこにいるとは思わない。オブザーバーのソースを確認してください:https://github.com/emberjs/ember.js/blob/master/packages/ember-metal/lib/observer.js。私は完全に理解していないが、すべてのことはまだ動作しますが、あなたが知る必要があるすべてがそこにあるように見えます。具体的には、 'Ember._suspendObserver'と' Ember。_suspendListener'、あるいはおそらく 'Ember.removeObserver'です。 –

答えて

-1

これは古い質問ですが、Google検索ではオブザーバーを中止しているようですが、コメントしたいと思います。

このような機能の使用例は明らかです。たとえば、オブジェクトの列挙型プロパティはリストボックスで表され、オブジェクトが変更される可能性があります。リストボックスを使用してサーバーからプロパティの変更を要求し、成功した場合に新しい値を設定する場合は、リストボックスでコントローラープロパティを使用し、オブジェクトが変更されたときにそのプロパティをオブジェクトプロパティに設定するそれを観察してサーバーに要求を出します。この場合、オブジェクトが変わるたびにオブザーバは望ましくない通知を受け取ります。

しかし、私はこれらのユースケースが非常に多様であるため、Emberがそれらをサポートできる方法がないことに同意します。

したがって、可能な回避策は、コントローラで変数を宣言して、プロパティを変更するたびに、ユーザーが行った変更のみに反応するように、それを使用することです:

doNotReact: false, 
updateManually: function() { 
    this.doNotReact = true; 
    Ember.run.scheduleOnce('actions', this, function() { 
     this.doNotReact = false; 
    }); 
    ............ 
    this.set('something', somevalue); 
    ............ 
}, 

onChange: function() { 
    if (this.doNotReact) return; 
    ............... 
}.observes('something') 

doNotReactの価値ます観察者が走る機会を得た後にリセットする。観察者のストッパー変数をリセットすることはお勧めしません。なぜなら、ストッパー変数は、既にプロパティーと同じ値に設定した場合には実行されないためです。

2

Emberは通知の中断をサポートしていません。私は強く上記のコメントに記載されているプラ​​イベートAPIとの対決に反対することをお勧めします。

なぜ私はHTTPリクエストの前にオブジェクトのデータをクリアするのが嫌なのでしょうか?奇妙に思える。

1

フラグを使用すると、計算されたものがまだトリガされます。

私が思いついたことは、計算された値を最後の既知の値で上書きすることです。後で、計算されたプロパティー定義を再度設定することによって、これを有効にすることができます。

let _myComputedProperty = Ember.computed('foobar', function() { 
    let foobar = this.get('foobar'); 
    console.log('myComputedProperty triggered >', foobar); 
    return '_' + foobar + '_'; 
}); 

Controller.extend({ 
    turnOffComputed: function() { 
    let myComputedProperty = this.get('myComputedProperty'); 
    this.set('myComputedProperty', myComputedProperty); 
    }, 

    turnOnComputed: function() { 
    this.set('myComputedProperty', _myComputedProperty); 
    } 
}) 

全例:あなたがそれをやりたい理由Conditional binding for a computed property

関連する問題