Jeder Mediator im PureMVC Framework, der sich bei seiner Viewkomponente für Events anmeldet muss diese spätestens beim entfernen des Mediators auch wieder abmelden.
In der Regel sieht der Code im Mediator, für das An- und Abmelden, folgendermaßen aus:
public class LoginMediator extends Mediator
{
override public function onRegister():void {
view.addEventListener(Event.A, eventAHandler);
view.addEventListener(Event.B, eventBHandler);
...
view.addEventListener(Event.Z, eventZHandler);
}
override public function onRemove():void {
view.removeEventListener(Event.A, eventAHandler);
view.removeEventListener(Event.B, eventBHandler);
...
view.removeEventListener(Event.Z, eventZHandler);
}
private function get view():DisplayObject{
return DisplayObject(viewComponent);
}
}
Dabei muss der Entwickler selbst darauf achten, dass er auch wirklich alle Eventlistener wieder abmeldet.
Das Framework Robotlegs bietet für diesen Fall einen automtisierten Ansatz, dort werden selbstständig alle registrierten Eventlistener abgemeldet sobald ein Mediator entfernt wird. Diese Funktionalität habe ich für das PureMVC Framework adaptiert und eine neue Mediatorklasse erstellt.
Alle Eventlistener die über die Methode “addViewListener” registriert werden, werden automatisch beim entfernen des Mediators Abgemeldet.
Sodass das vorherige Beispiel nun so aussieht:
public class LoginMediator extends EventMapMediator
{
override public function onRegister():void {
addViewListener(Event.A, eventAHandler);
addViewListener(Event.B, eventBHandler);
...
addViewListener(Event.Z, eventZHandler);
}
private function get view():DisplayObject{
return DisplayObject(viewComponent);
}
}
Die EventMap selber ist nicht vom Mediator abhängig und kann somit auch in Viewkomponenten verwendet werden. Dort muss sich aber selber darum gekümmert werden, die Eventlistener auch wieder zu entfernen, um Memoryleaks zu vermeiden.
Die Klassen findet ihr hier als Zip-Datei zum Download.
