Простое гибкое всплывающее окно с событием отправки в дочернем элементе и прослушивателем в родительском не работает

Parent.mxml Этот файл вызывает класс всплывающего окна ниже при нажатии кнопки.

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.managers.PopUpManager;

            var popup:pop = null ;
            protected function clickHandler(event:MouseEvent):void
            {               
                popup = PopUpManager.createPopUp(this,pop,true) as pop;
                popup.ok.addEventListener(MouseEvent.CLICK, captureComments);
                popup.close();
            }

            var str:String="";
            private function captureComments():void{
                Alert.show("Invoked Event Listener", "Alert");
                str=popup.comments;
            }
        ]]>
    </fx:Script>
    <mx:Button id="id1" label="Click" click="clickHandler(event)"/>
    <s:Label id="lbl" height="18" width="282"  text={str} />
</s:Application>

Ребенок.mxml

Этот файл является ссылкой на всплывающее окно, создающее всплывающее окно. Я настроил кнопки закрытия и отмены для работы по мере необходимости, но не смог распространить текст, введенный в комментарий, и вернулся к родителю.

    <?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow  xmlns:fx="http://ns.adobe.com/mxml/2009" 
                 xmlns:s="library://ns.adobe.com/flex/spark" 
                 xmlns:mx="library://ns.adobe.com/flex/mx"
                 layout="vertical" width="524" height="322"
                 showCloseButton="true"
                 close="close()"  chromeColor="#CCCCCC" 
                 horizontalAlign="center" verticalAlign="middle" color="#000000">

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.managers.PopUpManager;
            import mx.rpc.events.ResultEvent;


            [Bindable]public var comments:String;

            public function close(): void{
                PopUpManager.removePopUp(this);
            }

            private function save(): void{
                if(comments == null){
                    comments = "";
                }
                dispatchEvent(new ResultEvent(comments));
            }
        ]]>
    </fx:Script>
    <mx:HBox width="100%" height="70%">
        <mx:VBox width="100%" height="100%">
            <mx:TextArea id="comment" text="{comments}" width="100%" height="80%" change="comments = event.target.text">

            </mx:TextArea>
            <mx:HBox horizontalAlign="center" width="100%" height="20%">
                <s:Button id="ok" label="OK" chromeColor="#CCCCCC" click="save()" fontWeight="bold"/>
                <s:Button id="cancel" label="Cancel" chromeColor="#CCCCCC" click="close()" fontWeight="bold"/>
            </mx:HBox>
        </mx:VBox>
    </mx:HBox>

</mx:TitleWindow>

person user2358623    schedule 07.05.2013    source источник
comment
Вы отправляете ResultEvent, но не слушаете его. Вы только слушаете MouseEvent.CLICK. Более того, метод captureComments не принимает Event в качестве аргумента: это вызовет ошибки времени выполнения.   -  person RIAstar    schedule 07.05.2013
comment
@RIAStar он отправляет класс ResultEvent; но тип события - введенная пользователем строка [или пустая строка]. Я понятия не имею, как он стал бы это слушать.   -  person JeffryHouser    schedule 07.05.2013
comment
Работает ли объявление ваших переменных в обратном порядке, например var popup:pop = null ; ? Кроме того, как пользователь может вводить комментарии, если вы закрываете всплывающее окно, как только оно открывается?   -  person Amy Blankenship    schedule 07.05.2013


Ответы (2)


Вы отправляете ResultEvent, например:

dispatchEvent(new ResultEvent(comments));

Однако тип события — это введенный пользователем ввод. Ознакомьтесь с Конструктор ResultEvent. Первый аргумент — это тип события. Я понятия не имею, как вы сможете постоянно прослушивать тип события, который неизвестен во время компиляции.

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

dispatchEvent(new ResultEvent(ResultEvent.RESULT,false,true,comments));

В родительском файле добавьте прослушиватель событий следующим образом:

 popup.addEventListener(ResultEvent.RESULT, processResult);

Вы должны иметь возможность получить значение вашего комментария как свойство события:

    protected function processResult(event:ResultEvent):void{
        str=event.result
    }
person JeffryHouser    schedule 07.05.2013

Еще одна вещь, которую я сделал, - это в дочернем контейнере. Создайте общедоступную переменную для передачи функции от родителя, т.е.:

в родительском:

  protected function captureComments(comments:String):void{

            str=comments;
        }

у ребенка:

объявить общедоступную переменную и добавить функцию в функцию save()

         public var parentFunction:Function;

         private function save(): void{
            if(comments == null){
                comments = "";
            }
                parentFunction(comments);

Затем при создании всплывающего контейнера в родительском:

         protected function clickHandler(event:MouseEvent):void
        {               
            popup = PopUpManager.createPopUp(this,pop,true) as pop;
            popup.parentFunction = captureComments;
            popup.close();
        } 
person Jim Stewart    schedule 08.05.2013