Il est souvent fastidieux de devoir utiliser des [Bindable(’eventName’)] et accesseurs tout le long de la liste d’affichage pour que le composant perdu tout au fond de la celle-çi puisse avoir accés à un modèle se trouvant dans Application.application ou ailleurs.
Personnellement, j’utilise une autre méthode pour me liberer complètement de la position de mon composant dans l’affichage.
En effet, il existe une propriété méconnue dans LoaderInfo : sharedEvents. C’est un EventDispatcher unique qui est partagé par le swf courant et tout les swfs enfants qu’il va charger.
Imaginons que tout mes composants implementent UIAsker :
package org.nc.api.ui { public interface UIAsker { function answer (eventType:String,value:*) : void; } }
Dans le constructeur de mon composant, j’ecoute l’Event.ADDED_TO_STAGE, c’est en effet à ce moment là que je peux accéder à loaderInfo.sharedEvents, et j’envoie des demandes dessus, par exemple, récupérer la langue courante, ou autre chose du même genre, à l’aide d’un event spécifique que mes différents managers écoutent sur le loaderInfo.sharedEvents ( l’initialisation de mes managers passent par un setteur où je leur transmet cet EventDispatcher, ils s’abonnent aux events qu’ils vont avoir à gèrer, et répondent directement à l’objet qui fait une demande :
package org.nc.events { public final class AskEvent extends Event { private var _asker : UIAsker; public function AskEvent (type:String,asker:UIAsker) : void { super(type,false,false); _asker = asker; } public function get asker () : UIAsker { return _asker; } override public function clone () : Event { return new AskEvent(type,asker) as Event; } } }
Donc, quand mon manager reçoit une demande qui le concerne :
private function onAskEvent (e:AskEvent) : void { switch (e.type) { case AskEvent.GET_CURRENT_LANGUAGE : e.asker.answer(e.type,_currentLanguage); break; } }
Dans cet exemple, les demandes sont faites dés que l’objet est ajouté à la liste d’affichage, mais dans la réalité, pour éviter de controler des propriétés et modèles alors que le composant n’est pas affiché ou utilisé, il est préférable de faire ces demandes lorsque l’on passe visible ou que l’on devient le selectedChild d’une ViewStack par exemple.
Cette méthode me permet de m’abstraire complétement de la position de mon composant dans la liste d’affichage, et de pouvoir appeler les modèles qui m’interressent sans aucun soucis.