2011-12-08 40 views
1

在我的AIR應用程序中,我嘗試從一個類派發自定義事件到主窗口。 該類用於調用httpservice。我的目標是發送httpservice結果時發送自定義窗口。如何分離httpservice結果事件中的自定義事件

package fr.inter.DataProvider 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    import fr.inter.config.urlManager; 
    import fr.kapit.introspection.components.DisplayListComponent; 

    import mx.collections.XMLListCollection; 
    import mx.rpc.events.FaultEvent; 
    import mx.rpc.events.ResultEvent; 
    import mx.rpc.http.HTTPService; 

    [Event(name="evtPatSelect", type="flash.events.Event")] 

    public class sPatient 
    { 

     private var _phppaIndex:String; 
     private var _phppaNomU:String; 
     private var _phppaPrenom:String; 
     private var phpSearchPatNom:HTTPService; 


     public function sPatient() 
     { 

     } 


     public function sPhpSearchPat(p:Object):void 
     { 

      phpSearchPatNom = new HTTPService(); 
      phpSearchPatNom.method="POST"; 
      phpSearchPatNom.resultFormat = "e4x"; 
      phpSearchPatNom.addEventListener(ResultEvent.RESULT,resultListePatient); 
      phpSearchPatNom.addEventListener(FaultEvent.FAULT,serviceFault); 
      var urlPhp:urlManager=new urlManager(); 
      phpSearchPatNom.url = urlPhp.urlService() + "20SearchNom.php"; 
      phpSearchPatNom.send(p); 
     } 


     private function resultListePatient(event:ResultEvent):void 
     { 

      var xmlList:XMLList = XML(event.result).patientPHP; 
      var xmlListColl = new XMLListCollection(xmlList); 


      if(xmlListColl.length==1) 
      { 

       _phppaIndex = xmlListColl.getItemAt(0).paIndex; 
       _phppaNomU = xmlListColl.getItemAt(0).paNomU; 
       _phppaPrenom = xmlListColl.getItemAt(0).paPrenom; 

       var evtPat:Event = new Event("evtPatSelect"); 

       var evdips:EventDispatcher = new EventDispatcher(); 
       evdips.dispatchEvent(evtPat); 

      } 
     } 



     private function serviceFault(event:FaultEvent) 
     { 
      trace(event.fault.message); 
     } 

     public function get phppaIndex():String 
     { 
      return _phppaIndex; 
     } 

     public function set phppaIndex(value:String):void 
     { 
      _phppaIndex = value; 
     } 

     public function get phppaNomU():String 
     { 
      return _phppaNomU; 
     } 

     public function set phppaNomU(value:String):void 
     { 
      _phppaNomU = value; 
     } 

     public function get phppaPrenom():String 
     { 
      return _phppaPrenom; 
     } 

     public function set phppaPrenom(value:String):void 
     { 
      _phppaPrenom = value; 
     } 


    } 
} 

在主窗口中我添加了一個eventlistener,但這似乎不起作用。 你能幫我解決嗎?

感謝

+0

如果你想使用一個單獨的事件調度,並有其他事情能夠聆聽到您的實例,就好像它被調度的事件,您需要實現IEventDispatcher,請HTTP:/ /flexdiary.blogspot.com/2008/11/implementing-ieventdispatcher.html –

回答

0

首先,延長sPatient類作爲此事件

public class sPatient extends EventDispatcher { 

然後,創建一個類爲您的自定義事件

public class MyCustomEvent extends Event { 
     public static const CUSTOM_TITLE:String = "custom_title"; 
     public var eventData:Object; 

     public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, data:Object = null) { 
      super(type, bubbles, cancelable); 
      if(data != null) eventData = data; 
     } 

     public override function clone():Event { 
      return new CustomEvent(type, bubbles, cancelable); 
     } 

     public override function toString():String { 
      return formatToString("CustomEvent", "type", "bubbles", "cancelable", "eventPhase"); 
     } 
    } 

然後在您的sPatient類,去:

this.dispatchEvent(new MyCustomEvent(MyCustomEvent.CUSTOM_TITLE)); 

聽着它,像這樣

sPatientInstance.addEventListener(MyCustomEvent.CUSTOM_TITLE,functionHandler); 
+0

無需編寫事件類來定義事件的名稱。如果您覺得需要定義常量,那麼創建一個只具有靜態常量而無需事件實例化開銷的枚舉類。有關示例,請參閱Flex * EventKind類。如果不是建議不必要地寫一個自定義類,我會提高你的答案。 –

+0

感謝您的回答。艾米你可以解釋更多的細節如何做沒有事件類。謝謝 – Flex60460

+0

@AmyBlankenship我的印象是,他想發送自定義對象與事件,在這種情況下,他確實需要一個自定義事件。在旁註中,我總是爲這樣的事情創建一個自定義事件,它只是感覺不錯。 – ThomasM