Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Flex Skin addEventListener_Actionscript 3_Apache Flex_Flex4.5_Flex Spark - Fatal编程技术网

Actionscript 3 Flex Skin addEventListener

Actionscript 3 Flex Skin addEventListener,actionscript-3,apache-flex,flex4.5,flex-spark,Actionscript 3,Apache Flex,Flex4.5,Flex Spark,我有皮肤。此蒙皮有3种状态,需要能够根据所听到的事件更改状态 TextInput的持有者是一个面板,当用户单击某个位置时,它会发送事件 我不知道怎么去听这样的事情 面板中的文本输入: <s:TextInput id="nombre" x="10" y="23" width="264" borderVisible="false" chromeColor="#791111" color="#741111" contentBackgroundColor="#EC

我有皮肤。此蒙皮有3种状态,需要能够根据所听到的事件更改状态

TextInput的持有者是一个面板,当用户单击某个位置时,它会发送事件

我不知道怎么去听这样的事情

面板中的文本输入:

<s:TextInput id="nombre" x="10" y="23" width="264" borderVisible="false"
                 chromeColor="#791111" color="#741111" contentBackgroundColor="#ECECEC"
                 focusColor="#6E1212" fontWeight="bold" 
                 skinClass="skins.NormalInputText"
                 text="@{clientesModel.datosCliente.nombre}"/>
在TextInput皮肤中:

    public function init():void {
        hostComponent.addEventListener('panel_mode_edit',   editMode);
        hostComponent.addEventListener('panel_mode_query', queryMode);
        hostComponent.addEventListener('panel_mode_new',    newMode);
    }
    private function editMode(evt:Event):void {
        this.currentState = 'editing';
    }
    private function queryMode(evt:Event):void {
        this.currentState = 'normal';
    }
    private function newMode(evt:Event):void {
        this.currentState = 'adding';
    }

首先,除了逻辑检查(主要是检查父项是否不存在)之外,您应该绝不聆听父项
或以任何方式访问父项。在OOP语言中,您永远不想在对象链上工作;你总是想把它写下来。这既是正确的方法,也是防止错误的好方法

现在,针对实际问题。蒙皮不是要应用到的对象。它不是该对象的一部分。两者之间的关系非常松散。不能直接从主机访问蒙皮,但可以直接从蒙皮访问主机

您可以使用
hostComponent
访问蒙皮连接到的组件。现在,正如我上面所说的,您不想执行
hostComponent.parent
。首先,蒙皮是在对象添加到父对象之前附加的(除非之后在AS3中手动添加它,我怀疑您是否这样做了,这是一个坏主意)。相反,您希望执行以下操作:

  • 在父对象(我相信是面板)中侦听您的事件
  • 在该事件侦听器的处理程序中,可以执行以下三项操作之一:
  • 在您侦听的子对象中设置可绑定变量以查看蒙皮中的更改。这可以通过
    fx:definitions
    数组中的MXML轻松完成,在皮肤中,您可以在MXML中(使用
    {hostComponent.bindableVariableName}
    )或通过侦听hostComponent上的
    PropertyChangeEvent.PROPERTY\u change
    事件来侦听该更改
  • 调用一个完全设置不同外观的方法。它不那么紧凑,但在抽象方面更好,因为每个皮肤将被降级到单独的类中。但是,如果在移动设备或慢速桌面上,在对象出现在舞台上后设置皮肤可能会很慢
  • 在子对象中调用一个方法,该方法将分派您在皮肤中侦听的某种事件。就我个人而言,我过去就是这样做的。它干净、面向对象友好,并且与其他两个选项一样快或更快

  • 与皮肤沟通是Flex中的一大难题。这是一个有意的设计,但有时是需要的。正确的方式是创建高效应用程序的关键。

    Hi@Josh,我已经更新了帖子。在我的例子中,我有一组TextInput,需要能够同时完全更改它的状态。所以,当状态在新记录中时,我需要TextInput中的文本变为绿色,当查询时,红色和普通变为灰色。请给出一个使用bindable变量的例子好吗?我不太清楚该由谁来实施。谢谢
    panelClientes.dispatchEvent(new Event("panel_mode_query", true, true));
    
        public function init():void {
            hostComponent.addEventListener('panel_mode_edit',   editMode);
            hostComponent.addEventListener('panel_mode_query', queryMode);
            hostComponent.addEventListener('panel_mode_new',    newMode);
        }
        private function editMode(evt:Event):void {
            this.currentState = 'editing';
        }
        private function queryMode(evt:Event):void {
            this.currentState = 'normal';
        }
        private function newMode(evt:Event):void {
            this.currentState = 'adding';
        }