Un observateur est un objet A qui "observe" un autre objet B. En fait, B va notifier A de certaines informations à différents moments de son execution. On peut utiliser son propre système d'observation (imaginons par exemple que B a une propriété contenant cet objet A), mais on peut aussi utiliser le système plus universel fourni par Mozilla.
Ce système se compose d'un objet, " @mozilla.org/observer-service;1", qui est un Service d'observation. On enregistre auprés de ce service des objets observateurs, en indiquant qu'ils sont concerné par tel ou tel évènement (évènements qui n'ont rien à voir avec les évènement DOM comme click etc..). Ces évènements sont déterminés par les objets "observés" (des objets "B"). Ces derniers feront appels au service d'observation pour notifier de tel ou tel évènement.
Les composants / interfaces à mettre en oeuvre sont donc:
Pour ce faire, il faut d'abord réaliser l'observateur.
var myObserver = {
observe : function ( subject , topic , data ){
// traitements en fonction du topic...
if(topic == "foo"){
}else if (topic== "bar"){
}
// etc..
}
}
Ensuite, il faut enregistrer l'observateur, pour chacun des topics qu'il prend en charge, auprés du service d'observation
// récupération du service d'observation
var ObserverServ = Components.classes["@mozilla.org/observer-service;1"].
getService(Components.interfaces.nsIObserverService);
// enregistrement
ObserverServ.addObserver ( myObserver , "un-topic" , false );
ObserverServ.addObserver ( myObserver , "un-autre-topic" , false );
...
addObserver prend donc en paramètre votre observateur, un topic, et un boolean qui sera la plupart du temps à false (true, si votre observateur implémente l'interface nsIWeakReference, mais ceci est un autre sujet..).
Vous pouvez retirer un observateur pour un topic donné en appelant removeObserver :
ObserverServ.removeObserver ( myObserver , "un-topic");
Vous pouvez ensuite notifier les observateurs d'évènements dans vos objets. Il suffit de récupèrer le service d'observation, et d'appeler ensuite sa méthode notifyObservers
var ObserverServ = Components.classes["@mozilla.org/observer-service;1"].
getService(Components.interfaces.nsIObserverService);
ObserverServ.notifyObservers(this, "un-topic", null);
Ici tous les observateurs qui se seront déclarés pour le topic "un-topic", seront appelés par leur methode observe. Ils recevront en paramètre l'objet qui notifie (à cause du this) comme sujet, le nom du topic ("un_topic"), et une valeur null pour les données.
Il existe des topics natifs dans gecko, ce qui vous permet d'observer certains évènements courant. Voir la liste sur MDC. Pour les topics app-startup et xpcom-startup, vous devrez déclarer un composant XPCOM auprés du category manager comme indiquer sur cette page
Categorie : RessourcesLibs
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.