2013-05-07 3 views
0

Parent.mxml Этот файл вызывает popup-класс ниже, когда нажимается кнопка.Простая всплывающая подсказка с событием отправки в дочернем и слушателе в родительском не работает

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

Child.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> 
+0

Yo вы посылаете ResultEvent, но вы его не слушаете. Вы только слушаете MouseEvent.CLICK. Более того, метод 'captureComments' не принимает событие в качестве аргумента: это вызовет ошибки времени выполнения. – RIAstar

+0

@RIAStar он посылает класс ResultEvent; но тип события - введенная пользователем строка [или пустая строка]. Я понятия не имею, как он это выслушает. – JeffryHouser

+2

Работает ли объявление переменных обратно, например 'var popup: pop = null;'? Кроме того, как пользователь может вводить комментарии, так как вы закрываете всплывающее окно, как только оно открывается? –

ответ

0

Вы диспетчеризации ResultEvent, как это:

dispatchEvent(new ResultEvent(comments)); 

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

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

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

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

popup.addEventListener(ResultEvent.RESULT, processResult); 

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

protected function processResult(event:ResultEvent):void{ 
     str=event.result 
    } 
0

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

в родителю:

protected function captureComments(comments:String):void{ 

      str=comments; 
     } 

в детстве:

объявить общественный вар и добавить функцию к функции сохранения()

  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(); 
     } 

 Смежные вопросы

  • Нет связанных вопросов^_^