2009-07-22 19 views
1

私は奇妙なバインディングの問題に遭遇しました。以下のミニアプリケーションでは、 'someText'が変更されたときにFlex Labelコンポーネントが更新されますが、最初の呼び出し後にboundSetterは呼び出されません。基本的なバインディングの問題

要するに、ラベルが更新されている間に、boundSetterSomeText()関数が呼び出されないのはなぜですか?

この基本的な問題に誰かが光を当ててください。感謝万円!

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="1024" minHeight="768" 
    initialize="onInitialize()" 
> 
    <mx:Panel> 
     <mx:Label text="{this.someText}" /> 
     <mx:Button label="Set random text" click="generateRandom()" /> 
    </mx:Panel> 

    <mx:Script> 
     <![CDATA[ 
      import mx.binding.utils.ChangeWatcher; 
      import mx.binding.utils.BindingUtils; 


      [Bindable(event="xxx")] 
      public var someText : String; 


      public function onInitialize() : void 
      { 
       var cw:ChangeWatcher = BindingUtils.bindSetter(boundSetterForSomeText, this, ['someText']); 
      } 

      public function generateRandom() : void 
      { 
       this.someText = String(Math.round(Math.random() * 10000)); 
       this.dispatchEvent(new Event("xxx")); 
      } 


      public function boundSetterForSomeText(obj:Object) : void 
      { 
       trace(obj); 
      } 
     ]]> 
    </mx:Script> 
</mx:Application> 

答えて

0

あなたは、get/setのペアまたは「プロパティ」を作成するには、このコードを使用することができます:

private var _someText:String; 

[Bindable(event="xxx")] 
public function get someText():String 
{ 
    return _someText; 
} 

public function set someText(value:String):void 
{ 
    if (_someText != value) 
    { 
     _someText = value; 
     this.dispatchEvent(new Event("xxx")); 
    } 
} 
+0

そうですね、設定者は必要ありません。つまり、値を変更したり、好きな機能でイベントをディスパッチしたりすることができます。しかしゲッターを持つことは非常に重要です。 – Tom

0

イベントがデフォルトの場合は機能します。

[Bindable] 
public var someText : String; 

(デフォルトのイベントがあるのpropertyChange)私はいくつかのデバッグを行なったし、私はそれがカスタムイベントでは動作しない理由見当もつかない。私はそれがすべきだと思います。

+0

うん、奇妙な...かなりすぎ、に関する。 Adobeのドキュメンテーションにコメントとして投稿します。 – Tom