Вызов clickHandler из компонента ItemRenderer (изображение) - PullRequest
0 голосов
/ 18 июля 2011

Я использую 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>

Я хочу отправить событие по щелчку, поэтому, когда я нажимаю на изображение, я выполняю действие.Тем не менее, это дает мне ошибку, когда это сделать.Я провел поиск, и в предложенных ответах использовались externalDocument и ParentDoecument ... оба не работали.

Как я могу получить доступ к функции обработчика кликов (hbox1_clickHandler () в моем коде)?

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Я не думаю, что это возможно, если вы находитесь в классе приложений. Если это какой-то другой класс, то вы можете просто написать что-то вроде этого:

click="MyClass.hbox1_clickHandler()"

Кроме того, это не лучшая идея для создания встроенных элементов рендеринга. Лучший подход - расширить базовый элемент рендерера и создать свой собственный. Также вы можете расширить класс Flash событий и сделать свой собственный. Это дает вам возможность отправить некоторые дополнительные данные вместе с вашим событием.

Но в любом случае, использование вашего кода подхода будет выглядеть так:

 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>
2 голосов
/ 18 июля 2011

Он будет работать с externalDocument.functionName, пока функция объявлена ​​как public.В вашем случае, если вы измените объявление функции с защищенного на общедоступное, оно будет работать.Вот пример кода примера [работает]:

<?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>
...