2009-10-08 10 views
5

さて、私はこの壁で頭を叩いていました。私は、Flexで次のセット機能を持っています。フレックスセット機能が呼び出されない

public function set periodChangeAmount(value:int):void 
    { 
     _PeriodChangeAmount = value; 
     refreshStartEndDates(); 
    } 

periodChangeAmountを-1または1に設定すると、setメソッドが起動します。私がゼロに設定すると、解雇されません。どうしたんだ?誰もがゼロに設定するときに呼び出されない理由を知っていますか?オブジェクト型を数値またはオブジェクトに変更すると、期待どおりに動作しません。どんな助けでも大歓迎です。

+0

これは私にとってうまく動作します。これをテストするために使用しているコードを提供できますか? –

答えて

8

セッターにトレースを書き込んで、コールされていないことを確認しましたか?

periodChangeAmountBindable読み書き可能ですか?この場合、flexは内部的にgetterを呼び出して、設定する値が既存の値でないことを確認します。プロパティの現在の値(ゲッターから返される値)が設定される値と同じ場合、セッターは呼び出されません。

private var privateVar:Boolean = false; 

[Bindable] 
public function set readWriteProp(value:Boolean):void 
{ 
    trace("set called with " + value + " current is " + privateVar); 
    privateVar = value; 
} 
public function get readWriteProp():Boolean 
{ 
    trace("get called : " + privateVar); 
    return privateVar; 
} 
//... 
a.readWriteProp = true; 
a.readWriteProp = true; 

トレースさ出力:

と呼ばれます:真ゲッターは二回呼び出されたことを

注しかし:真の電流と呼ばれる偽
セットは
が呼び出される偽でありますセッターは一度しか呼ばれなかった。 2番目の代入では、設定する現在値と値が同じ(true)なので、setterは呼び出されません。

フレックスデベロッパーチームは、バインディングの冗長性を避けるためにこの方法を採用したと信じています。

+0

Bummer。オブジェクトをBindableのままにする必要がある場合は、これを回避する方法はありますか? – CodeMonkey

+1

データバインディングイベントを手動でディスパッチできます。 –

+0

setterを呼び出す前にperiodChangeAmountの値をチェックし、同じ値である場合はrefreshStartEndDates()を明示的に呼び出します。 – Amarghosh

1

上記の問題を解決するには、以下のようにプロパティを設定する前に、バインド可能なイベントを追加してそのイベントをディスパッチします。

private var privateVar:Boolean = false; 
[Bindable("bindableEventProperty")] 

public function set readWriteProp(value:Boolean):void 
{  
    trace("set called with " + value + " current is " + privateVar); 
    privateVar = value; 
} 
public function get readWriteProp():Boolean 
{ 
    trace("get called : " + privateVar);  
    return privateVar; 
} 

dispatchEvent(new Event("bindableEventProperty")); 
a.readWriteProp = true; 
a.readWriteProp = true; 

このイベントは、プロパティ値が同じでもプロパティのsetメソッドが呼び出されるようにします。

関連する問題