从ItemRenderer组件(图像)内部调用clickHandler

时间:2011-07-18 12:23:15

标签: flash flex actionscript flex4 adobe

我正在使用一个Datagrid,它有一个包含图像的itemRenderer:

protected static function hbox1_clickHandler(event:MouseEvent):void
        {
            //some action
        }


<mx:DataGrid id="reportDG" dataProvider="{CDODReportsModel.instance.reportDataArrayCollectionObject}"  color="black" horizontalScrollPolicy="on">
    <mx:columns>                        
        <mx:DataGridColumn headerText="info">
            <mx:itemRenderer>
                <fx:Component>
                    <mx:HBox horizontalAlign="center">
                                <mx:Image source="assets/images/i_info.png" scaleX="0.6" scaleY="0.6" click="hbox1_clickHandler(event)"/>
                    </mx:HBox>
                </fx:Component>
            </mx:itemRenderer>
        </mx:DataGridColumn>
        <mx:DataGridColumn dataField="NAME" headerText="NAME"/>                         
        <mx:DataGridColumn dataField="TOTAL" headerText="TOTAL"/>

    </mx:columns>

</mx:DataGrid>

我想点击发送一个事件,所以当我点击图片时,我会做一个动作。但是,这样做会给我一个错误。我做了一些搜索,建议的答案是使用outerDocument和ParentDoecument ..两者都没有用。

如何访问点击处理函数(我的代码中的hbox1_clickHandler())?

2 个答案:

答案 0 :(得分:3)

我不认为如果你在Application类中这是可能的。 如果这是其他类,那么你可以这样做:

click="MyClass.hbox1_clickHandler()"

此外,这不是最好的想法内联项目渲染。最好的方法是扩展基础项目渲染器并创建自己的渲染器。您也可以扩展Flash Event类并自己制作。这样做可以为您的活动发送一些额外的数据。

但无论如何,使用你的方法代码将是这样的:

 protected function reportDG_initializeHandler(event:FlexEvent):void
 {
  reportDG.addEventListener("clicked", hbox1_clickHandler);
  function hbox1_clickHandler(event:Event):void
  {
   //some action
  }
 }

<mx:DataGrid initialize="reportDG_initializeHandler(event)">
    <mx:columns>
        <mx:DataGridColumn>
            <mx:itemRenderer>
                <fx:Component>
                    <mx:HBox>
                        <mx:Image click="dispatchEvent(new Event('clicked', true))"/>
                    </mx:HBox>
                </fx:Component>
            </mx:itemRenderer>
        </mx:DataGridColumn>
    </mx:columns>
</mx:DataGrid>

答案 1 :(得分:2)

只要函数声明为'public',它就可以使用outerDocument.functionName。在您的情况下,如果您将函数声明从protected更改为public,它将起作用。以下是示例代码[working]:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx">
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            public function hbox1_clickHandler(event:MouseEvent):void
            {
                Alert.show("ite works");
            }
        ]]>
    </fx:Script>
    <mx:DataGrid id="reportDG" dataProvider="{new ArrayCollection(['A','B'])}"  color="black" horizontalScrollPolicy="on">
        <mx:columns>                        
            <mx:DataGridColumn headerText="info">
                <mx:itemRenderer>
                    <fx:Component>
                        <mx:HBox horizontalAlign="center">
                            <mx:Button label="Button" click="outerDocument.hbox1_clickHandler(event)"/>
                        </mx:HBox>
                    </fx:Component>
                </mx:itemRenderer>
            </mx:DataGridColumn>
            <mx:DataGridColumn dataField="NAME" headerText="NAME"/>                         
            <mx:DataGridColumn dataField="TOTAL" headerText="TOTAL"/>

        </mx:columns>

    </mx:DataGrid>
</s:WindowedApplication>