Flex中不同组件的事件优先级

时间:2012-06-20 09:56:57

标签: events flex

我有以下代码,每个元素都有关联的事件。当我单击单选按钮时,属于onItemClick的{​​{1}}事件正在table事件后执行。我认为这是由于onSelect是父亲,table是孩子。

rb2

我需要以相反的顺序执行这两个事件:private function onItemClick(e:ListEvent):void { selectedRow = parseInt(e.itemRenderer.data.Id)-1; trace("selectedRow: "+selectedRow); } public function selectPoint(event:MouseEvent):void{ trace("selectPoint"); } <mx:DataGrid id="table" dataProvider="{listCol}" itemClick="onItemClick(event)"> <mx:columns> <mx:DataGridColumn id="posibilidades" rendererIsEditor="true" editorDataField="selected" headerText="Posibilidades" width="100" textAlign="center" draggable="false" editable="false" resizable="false" sortable="false"> <mx:itemRenderer> <mx:Component> <mx:RadioButton name="rb2" label="Punto 2" fontSize="13" enabled="false" groupName="_rb" value="1" textAlign="center" preinitialize="event.target.styleName='rbstyle'" click="outerDocument.selectPoint(event)" creationComplete="outerDocument.rbCreated(event)"/> </mx:Component> </mx:itemRenderer> </mx:DataGridColumn> </mx:columns> </mx:DataGrid> ,然后是onItemClick

如何在onSelect之前执行onItemClick?我读了一些与onSelect相关的优先级,但它没有用,因为事件是针对不同的组件的。

修改: 我会尝试解释我的问题以及为什么我在Flex中做这个奇怪的事情。

我有一个Datagrid组件,它由一个名为“Add measure”的按钮动态更新。这个Datagrid有4列;添加到此Datagrid的每个度量都包含两个单选按钮作为最后一个单元格(在第4列上)。

addEventListener

问题是:当我删除一行时,数据将从显示中删除并正常工作。但是当我添加一个新的时候,Flex会重复使用单选按钮,我无法知道新的无线电按钮在哪一排(如果Flex重复使用它们,我删除3行并添加一个新的,无线电 - 按钮属于这个新行可以属于删除的最后一行,或另一行;它是不可能保证的。)

所以,我想:“好的Fran,也许你可以在Datagrid中向|-----------------------------------------------------------------------------| | | | | | | #1 cell | #2 cell | #3 cell | (o) Radiobutton1 (o) Radiobutton2 | | | | | | |-----------------------------------------------------------------------------| 添加一个事件监听器,当用户点击单选按钮时,你可以知道哪一行是单选按钮最近点击(因为itemClick处理程序)“。但是Flex没有按照我预期的顺序执行处理程序,所以我现在真的被卡住了。

我正在尝试itemClick事件而不是onRollOver并且效果很好,但并非总是如此。

3 个答案:

答案 0 :(得分:0)

您可以在两个事件处理程序中添加两个事件全局数组(或使用单个事件处理程序)。每次检查数组大小是否为长度为2,并包含ListEvent和MouseEvent,并使用if(event是ListEvent)处理事件对象,否则....

然后清除阵列,为下一个要触发的事件做好准备。

答案 1 :(得分:0)

为什么不在DataGrid上保留一个监听器(onItemClick(e:Event))并使用'currentTarget'和'target'来识别是谁导致了点击并按照您希望的方式执行序列。在这种情况下,target.id将为'rb2',currentTarget.id将为'tabe'。

    protected function onItemClick(event:Event):void
    {
        //handle your table click here.
        selectedRow = parseInt(event.itemRenderer.data.Id)-1;
        if(event.target.id == 'rb2')
        {
            //do something
        }
    }

希望它有所帮助。

答案 2 :(得分:0)

如果问题是在flex回收itemrender时识别当前行,我们可以在itemRenderer中使用一个eventlistener。创建一个新的CustomItemRender类,它扩展uiComponent并实现IDropInListItemRenderer和IListItemRenderer。使用listdata和data属性访问行信息和数据信息。

例如CustomRenderer代码如下:

包 {     import flash.events.MouseEvent;

import mx.controls.DataGrid;
import mx.controls.RadioButton;
import mx.controls.listClasses.BaseListData;
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;

public class CustomItemRender extends UIComponent implements IDropInListItemRenderer,IListItemRenderer
{
    public function CustomItemRender()
    {
        super();
    }


    private var _data:Object
    public function get data():Object
    {
        return _data;
    }

    public function set data(value:Object):void
    {
        _data = value;
    }

    private var _listData:BaseListData
    public function get listData():BaseListData
    {
        return _listData;
    }

    public function set listData(value:BaseListData):void
    {
        _listData = value;
    }

    private var radioButton:RadioButton;
    override protected function createChildren():void {
        super.createChildren();
        if(!radioButton){
            radioButton = new RadioButton();
            radioButton.addEventListener(MouseEvent.CLICK, handleRadioButtonClick, false, 0, true);
            this.addChild(radioButton);
        }           
    }

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
        super.updateDisplayList(unscaledWidth, unscaledHeight);
        radioButton.move(10, unscaledHeight*0.5);
    }

    private function handleRadioButtonClick(event:MouseEvent):void{
        trace("row data: "+data);
        trace("currently visible row Info: "+listData.rowIndex+" "+listData.columnIndex);
        trace("dataprovider "+DataGrid(listData.owner).dataProvider.toString())
    }
}

}

此示例无法解决您的问题。我希望这会对你有所帮助。