Краткое описание
nsIObserver
обеспечивает объекту возможность принимать сообщения. Такие сообщения обычно (но не всегда) рассылаются с помощью интерфейса nsIObserverService.
Код интерфейса
[scriptable, uuid(DB242E01-E4D9-11d2-9DDE-000064657374)] interface nsIObserver : nsISupports { void observe( in nsISupports aSubject, in string aTopic, in wstring aData ); };
Методы
observe
void observe( in nsISupports aSubject, in string aTopic, in wstring aData );
Метод observe
вызывается тогда, когда приходит сообщение на ту тему, для прослушивания которой объект был зарегистрирован.
Обычно, в aSubject
содержится объект, в результате изменения или другого действия над которым было создано полученное сообщение. Параметр aTopic
определяет тип действия или изменения. А необязательный параметр aData
и другие данные дополняют информацию о совершенном действии или изменении.
Конкретные значения, а так же смысл переданных параметров бывают разными, в зависимости от того где был зарегистрирован приемник и какая тема прослушивается.
Конкретный пример использования интерфейса nsIObserver
может быть настроен на получение множества типов сообщений, и может вести себя по-разному в зависимости от переданных параметров. Чаще всего, основной параметр для выбора дальнейших действий — это aTopic
, и в коде надо учитывать, что метод может быть вызван с неизвестным на момент написания значением параметра aTopic
.
Так как система, обслуживающая прием сообщений, может вызывать конкретный приемник в разных контекстах, настоятельно рекомендуется не добавлять и не удалять приеники непосредственно в момент вызова метода observe
.
Связанные интерфейсы
Пример кода
Следующий пример демонстрирует применение интерфейса nsIObserver
, который позволяет зарегистрировать объект в системе пользовательских настроек для получения сообщений об изменении каких-либо значений (полный код примера и дополнительную информацию о системе настроек см. на странице Использование настроек из MozillaZine).
var prefObserver = { // nsIObserver observe: function (aSubject, aTopic, aData) { if (aTopic == "nsPref:changed") { // observe preference changes // aData contains the name of the changed preference dump(aData+" changed!"); } }, QueryInterface: function(aIID) { if(!aIID.equals(CI.nsISupports) && !aIID.equals(CI.nsIObserver)) throw CR.NS_ERROR_NO_INTERFACE; return this; } };