我有一个Flex变量,它依赖于许多其他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 :(得分:0)
来自the Documentation,这是不可能的:
“单个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);
}