Actionscript 3 Flex Skin addEventListener
我有皮肤。此蒙皮有3种状态,需要能够根据所听到的事件更改状态 TextInput的持有者是一个面板,当用户单击某个位置时,它会发送事件 我不知道怎么去听这样的事情 面板中的文本输入: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
<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';
}