2015-11-06 85 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); 
     }