0

我知道可以使组件的参数依赖于变量,前提是该变量包含 [Bindable] 标记。这意味着更新 Bindable 变量的值会自动更新组件。

是否可以使另一个变量依赖于 Bindable 变量?

在下面的示例中,我有一个绑定的变量 btnClicked。当 btnClicked 被调用的函数 btnClick() 更改时,TextArea 中的文本将按预期更新。

我希望能够在更新 btnClicked 时更新另一个变量 btnText。我不知道如何传达这种依赖关系。在下面的代码中,btnText 的值最初是预期的“clickMe”。但是,当 btnClicked 更改时,按钮上的文本不会更新为“unclickMe”。

<fx:Script>
    <![CDATA[
        [Bindable]
        public var btnClicked:Boolean = false;

        public function btnClick():void{
            btnClicked = !btnClicked;
        }

        [Bindable]
        public function get btnText():String{
            return btnClicked?"unclickMe":"clickMe";
        }
    ]]>
</fx:Script>

<s:Button click="btnClick()" label="{btnText}"/>

<s:TextArea y="50" text="{btnClicked?'Button is clicked':'Button is unclicked'}"/>

如何更改上面的代码,以便在更改 btnClicked 时自动更新 btnText?

是否有可能有一个任意长的连接变量链,每个变量都在前一个更新时更新?

4

3 回答 3

3

您还可以使用 aChangeWatcher来检测您的可绑定属性何时更新:

<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" creationComplete="init(event)">

    <fx:Script>
        <![CDATA[

            import mx.binding.utils.ChangeWatcher;
            import mx.events.FlexEvent;

            public var watcher:ChangeWatcher;

            [Bindable]
            public var btnClicked:Boolean = false;
            [Bindable]
            public var btnText:String = 'clickMe';

            protected function btnClick():void {
                btnClicked = !btnClicked;
            }

            protected function init(event:FlexEvent):void
            {
                watcher = ChangeWatcher.watch(this, 'btnClicked', watcherListener);
            }

            protected function watcherListener(event:Event):void {
                btnText = btnClicked ? 'unclickMe' : 'clickMe';
            }

        ]]>
    </fx:Script>

    <s:Button x="303" y="30" label="{btnText}" click="btnClick()"/> 
    <s:TextArea x="303" id="txt" y="96" text="{btnClicked ? 'Button is clicked' : 'Button is unclicked'}"/>

</s:Application>

希望能有所帮助。

于 2015-11-06T08:27:34.393 回答
2

在这种情况下,您所要做的就是更新您的btnClick函数以调度PropertyChangeEvent

public function btnClick():void{
    btnClicked = !btnClicked;
    dispatchEvent(new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE));
}

这是因为 [Bindable] 的工作方式 - 请参阅[Bindable] 在 actionscript 中的含义是什么?一个很好的解释。 使用 Bindable 元数据标签绑定到函数、对象和数组也是很好的后台阅读资源。

编辑:不要忘记导入语句!

import mx.events.PropertyChangeEvent;

如果您ctrl-space在键入PropertyChangeEvent.

于 2015-11-04T16:01:40.337 回答
1

我找到了一个解决方案,但如果有人有一个使用内置 Flex 功能的更清洁的解决方案,请发布它。

每次更改 btnClicked 的值时,以下代码都会更新 btnText 的值。它通过为 btnClicked 设置一个显式调用函数 updateBtnText 的 setter 函数来实现这一点。有关getter 和 setter 如何允许您在任何时候读取或写入变量时调用其他函数的更多信息,请参阅此说明。

<fx:Script>
    <![CDATA[
        private var _btnClicked:Boolean = false;

        [Bindable]
        public function get btnClicked():Boolean{
            return _btnClicked;
        }

        public function set btnClicked(newBtnClicked:Boolean):void{
            _btnClicked = newBtnClicked;
            updateBtnText();
        }

        private function updateBtnText():void{
            btnText = btnClicked?"unclickMe":"clickMe";
        }

        public function btnClick():void{
            btnClicked = !btnClicked;
        }

        [Bindable]
        public var btnText:String = btnClicked?"unclickMe":"clickMe";

    ]]>
</fx:Script>

<s:Button click="btnClick()" label="{btnText}"/>

<s:TextArea y="50" text="{btnClicked?'Button is clicked':'Button is unclicked'}"/>
于 2015-11-04T17:01:15.280 回答