2011-05-12 6 views
0

Comment implémenter correctement des événements personnalisés? Je pensais que les éléments suivants devraient travailler, mais je ne reçois jamais CustomEvent.READY dans le principal modèleComment implémenter des événements personnalisés?

package mvc 
{ 
    import flash.events.Event; 
    public dynamic class CustomEvent extends Event 
    { 
     public static const MY_EVENT:String = "myEvent"; 
     public static const READY:String = "ready"; 

    public function CustomEvent(type:String) 
    { 
     super(type); 
    } 
} 
} 

Dans les Model.as qui étend AbstractModel qui étend EventDispatcher

private function initWorld():void { 
     _worldModel = new WorldModel(); 
     _worldModel.addEventListener(CustomEvent.READY, update); 
} 

Puis, en WorldModel.as qui étend AbstractModel qui étend EventDispatcher, j'envoie un événement, mais la mise à jour n'est jamais appelée. Pourquoi?

dispatchEvent(new Event(CustomEvent.READY)); 

Répondre

1
_worldModel.dispatchEvent(new CustomEvent(CustomEvent.READY)); 

Vous devez instancier un CustomEvent, pas un Événement. Grande différence.

Vous pouvez également utiliser votre événement personnalisé pour transmettre des paramètres supplémentaires à l'événement expédié, ce qui se révélera incroyablement pratique si vous utilisez votre CustomEvent fortement

package com.b99.events 
{ 
    import flash.events.Event; 

    /** 
    * ... 
    * @author bosworth99 
    */ 
    public class AppEvents extends Event 
    { 
     public static const APP_READY  :String = "application ready"; 
     public static const XML_LOADED  :String = "XML has loaded"; 
     public static const CHANGE_COMPLETE :String = "state change complete"; 
     public static const PAGE_ADDED  :String = "page content added"; 
     public static const PAGE_REMOVED :String = "page content removed"; 
     public static const LIBRARY_LOADED :String = "external library loaded"; 
     public static const IMAGE_LOADED :String = "external image loaded"; 
     public static const LOAD_ERROR  :String = "external load failed"; 

     public var arg:*; 

     public function AppEvents(type:String, bubbles:Boolean = false, cancelable:Boolean = false, ...a:*) 
     { 
      super(type, bubbles, cancelable); 
      arg = a; 
     } 

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

    } 
} 

Vous pouvez alors passer un certain nombre d'arguments le long de une fonction de réception:

this.dispatchEvent(new AppEvents(AppEvents.LIBRARY_LOADED, false , false, _name, _library, _names)); 

Et d'accéder à eux dans la fonction de réception sous la forme d'un tableau.

private function onLibraryLoad(e:AppEvents):void 
     { 
      _digestExternalLib.removeEventListener(AppEvents.LIBRARY_LOADED, onLibraryLoad); 

      var currentIndex:int = AppData.navLocations.indexOf(e.arg[0], 0); 

      AppData.libraries.push(e.arg[0]); 
      AppData.libraryCon.push(e.arg[1]); 
      AppData.libraryNames.push(e.arg[2]); 

     } 

J'ai tiré ce d'un projet de fonctionnement ... mais vous devriez être en mesure de recueillir les bits importants ... Bonne chance!

+0

grands merci qui semble vraiment utile en effet! Il s'avère que mon événement était déclenché avant que l'auditeur ne soit initié. un peu idiot vraiment. – davivid

+0

Dans ce cas, il n'est pas nécessaire d'envoyer une instance de la classe CustomEvent. – Ohas

+0

@Omer = vous avez totalement raison. Puisque le customEvent de l'OP n'ajoute aucune fonctionnalité supplémentaire, le const statique est tout ce qui est nécessaire (et pourrait être conservé n'importe où). Dans ce cas, cependant, la question était «comment implémenter des événements personnalisés» et non «comment utiliser des constantes statiques» ... – Bosworth99

0

Je ne vois pas vraiment de problème avec le code. Juste pour tester, essayez d'ajouter cette déclaration à la fin de initWorld() méthode: méthode

_worldModel.dispatchEvent(new Event(CustomEvent.READY)); 

Si votre mise à jour() est appelée, qui indiquerait que votre méthode dispatchEvent() existant n'est pas appelé.

+0

mmm ajoutant que le test fonctionne comme prévu. Ma méthode dispatchEvent est appelée depuis que j'ai des traces de chaque côté, très étrange. – davivid

+0

Mais vous n'utilisez pas réellement votre événement personnalisé - seulement la constante statique trouvée dans la classe d'événement personnalisée. – Bosworth99

+0

erreur idiote, je commençais WorldModel qui tirait l'événement, avant que l'auditeur a été créé ... – davivid

Questions connexes