Flex:changewatcher是否可以观察多个变量?

时间:2015-11-06 16:18:13

标签: actionscript-3 flex flex4 adobe mxml

我有一个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。

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);
        }