2015-11-06 86 views
-2

我有取決於許多其他Flex變量的一個Flex變量。我希望這個變量在任何時候都被更新,它所依賴的任何變量都會被更新。使用單個ChangeWatcher可以做到這一點嗎?Flex:changewatcher可以觀察多個變量嗎?

具體而言,可以將下面的代碼被修改,使得它僅使用一個返回ChangeWatcher並且如果是這樣怎麼辦?

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" 
       creationComplete="init(event);"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.binding.utils.ChangeWatcher; 
      import mx.events.FlexEvent; 
      import mx.events.PropertyChangeEvent; 

      public var watcher1:ChangeWatcher; 
      public var watcher2:ChangeWatcher; 
      public var watcher3:ChangeWatcher; 

      public var nClicked:int = 0; 
      [Bindable] 
      public var buttonCounterTxt:String = "nclicked =" + nClicked.toString(); 
      [Bindable] 
      public var btn1Clicked:Boolean = false; 
      [Bindable] 
      public var btn2Clicked:Boolean = false; 
      [Bindable] 
      public var btn3Clicked:Boolean = false; 

      protected function init(event:FlexEvent):void 
      { 
       watcher1 = ChangeWatcher.watch(this, 'btn1Clicked', updateNClicked); 
       watcher2 = ChangeWatcher.watch(this, 'btn2Clicked', updateNClicked); 
       watcher3 = ChangeWatcher.watch(this, 'btn3Clicked', updateNClicked); 
      } 

      protected function updateNClicked(event:Event):void{ 
       nClicked = 0; 
       if(btn1Clicked) 
        nClicked++; 
       if(btn2Clicked) 
        nClicked++; 
       if(btn3Clicked) 
        nClicked++; 
       buttonCounterTxt = "nclicked =" + nClicked.toString(); 

      } 
     ]]> 
    </fx:Script> 

    <s:Button id="myBtn1" x="50" y="0" click="{btn1Clicked=!btn1Clicked}" 
       label="{btn1Clicked?'unclickMe':'clickMe'}"/> 
    <s:Button id="myBtn2" x="50" y="50" click="{btn2Clicked=!btn2Clicked}" 
       label="{btn2Clicked?'unclickMe':'clickMe'}"/> 
    <s:Button id="myBtn3" x="50" y="100" click="{btn3Clicked=!btn3Clicked}" 
       label="{btn3Clicked?'unclickMe':'clickMe'}"/> 

    <s:Label x="50" y="200" text="{buttonCounterTxt}"/> 

</s:Application> 

我正在使用Flex 4.14.1。

+0

我認爲你可以**不**使用一個'ChangeWatcher'爲多個屬性。 – akmozo

+0

我不知道如果你貼的代碼只是作爲一個例子,你真的需要一個切換按鈕,但不是所有的,你可以用一個簡單的['ToggleButton'](http://help.adobe.com/ EN_US/FlashPlatform /參考/動作/ 3 /火花/組件/ ToggleButton.html)組件... – akmozo

+0

也許你只需要創建這些屬性的一些getter和setter方法?只要值發生變化,setter函數就可以調用你的'updateNClicked()'函數。 –

回答

0

the Documentation,它是不可能的:

「A單一ChangeWatcher實例可以觀看一個屬性或屬性鏈的屬性鏈是從宿主對象的可訪問性的序列。例如,表達式。 obj.abc包含財產鏈(a,b,c)。「

在我的情況的屬性是不一樣的產業鏈的一部分,所以我不能有一個單一的觀察者觀看所有的人。

但是,代碼可以被簡化。任何時候任何因變量都被更新時,需要調用更新主變量的函數。這樣做的ChangeWatchers不需要聲明或命名。 ChangeWatcher聲明可以被刪除,init函數被這個替換:

 public function init(event:FlexEvent):void{ 
      ChangeWatcher.watch(this, 'btn1Clicked', updateNClicked); 
      ChangeWatcher.watch(this, 'btn2Clicked', updateNClicked); 
      ChangeWatcher.watch(this, 'btn3Clicked', updateNClicked); 
     }