【问题标题】:Flex 4.6 - Event Handling ConflictFlex 4.6 - 事件处理冲突
【发布时间】:2013-06-20 11:04:06
【问题描述】:

我有一个包含许多列的数据网格,其中一个列包含一组使用 ItemRenderer 的按钮。数据网格本身有一个显示面板的单击事件。但是,当单击任何按钮时,不应执行数据网格的单击事件。我怎样才能做到这一点?目前,当按钮被点击时,按钮点击和数据网格事件都会被调度。

下面是当前的实现:


Monitoring.mxml,其中有一个 datagrid,其中一列使用 ItemRenderer 来存储一组按钮。

<s:GridColumn width="300" dataField="" headerText="Control Buttons"
                          itemRenderer="com.example.ItemRenderer.ButtonControlsItemRenderer">
</s:GridColumn>         

ButtonControlsItemRenderer.mxml 中,我有 2 个按钮 - 日志和咨询

<s:Button id="btn_log" width="49" height="35" label="Log" 
              click="btn_log_clickHandler(event)"/>
<s:Button id="btn_Advisory" width="81" height="35" label="Advisory"
              click="btn_Advisory_clickHandler(event)"/>

这两个按钮通过这些功能将自定义事件发送到数据网格。

protected function btn_log_clickHandler(event:MouseEvent):void {
            var myEventObject:Event = new Event("logButtonEventRenderer",true);
            dispatchEvent(myEventObject);
}

protected function btn_Advisory_clickHandler(event:MouseEvent):void{
            var myEventObject1:Event = new Event("AdvisoryButtonEventRenderer",true);
            dispatchEvent(myEventObject1);  
}

已声明事件元数据并已在 Monitoring.mxml 中添加事件侦听器:

[Event(name="logButtonEvent", type="com.example.GetSelectedSystemEvent")]
[Event(name="AdvisoryButtonEvent", type="flash.events.Event")]

dg_Events.addEventListener("logButtonEventRenderer",btn_logButtonHandler); 
dg_Events.addEventListener("AdvisoryButtonEventRenderer",btn_AdvisoryButtonHandler);

protected function btn_logButtonHandler(event:Event):void{
    // Do something; 
}

protected function btn_AdvisoryButtonHandler(event:Event):void{
    // Do something
}

//Datagrid Click Event
protected function dg_Events_gridClickHandler(event:GridEvent):void { 
    // Display Panel
}

非常感谢您的帮助!

【问题讨论】:

    标签: actionscript-3 apache-flex datagrid event-handling flex4


    【解决方案1】:

    尝试在按钮点击hanler中调用stopImmediatePropagation函数。鼠标事件会冒泡。

    protected function btn_log_clickHandler(event:MouseEvent):void {
       event.stopImmediatePropagation();
       var myEventObject:Event = new Event("logButtonEventRenderer",true);
       dispatchEvent(myEventObject);
    }
    

    【讨论】:

    • 感谢您的回复。我试过了,但数据网格的点击事件仍然被触发。我只需要发送按钮单击事件。
    • 是否在 btn_logBu​​ttonHandler 和 btn_AdvisoryButtonHandler 中都添加了 stopImmediatePropagation?
    • 是的,但它仍然无法正常工作。我打印了 eventPhase 和 eventCurrentTarget,似乎数据网格的 clicked 事件首先被执行。
    • 我认为在这里使用stopImmediatePropagation() 不起作用的原因是因为我们谈论的是两种不同的事件类型。查看每个处理程序中使用的事件类型:MouseEventGridEvent。你不能停止传播不同的事件。 @Gzzzy 你试过在网格上收听普通的MouseEvent.CLICK 吗?可能存在问题,因为他们不厌其烦地创建了一个单独的 GridEvent 类型。您还可以尝试使用GridEventcolumnIndexcolumn 属性来了解用户何时单击您的魔术按钮。
    • 我刚刚找到了同样的原因。起初我以为是在数据网格上添加了 mouseEvent 。所以尝试使用 MouseEvent 而不是 GridEvent 。
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2022-12-31
    • 2012-07-20
    • 2020-01-13
    • 2014-11-28
    • 2011-07-16
    • 2018-10-12
    • 2016-06-30
    相关资源
    最近更新 更多