Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.
endUpdate();
nieaktualizowany. Metoda endUpdate, która jest wywoływana w czasie tworzenia komponentu, wykonuje metody initialize (jeśli dany komponent nie jest inicjalizowany) i updated. updated Implementacja pusta. comp.updated(); get_isUpdating Zwraca wartość składowej _updating. comp.get_isUpdating(); initialize Oznacza dany komponent jako comp.initialize(); inicjalizowany. get_initialized Zwraca wartość składowej _initialized. comp.get_initialized(); Typ Sys.Component 147 TABELA 3.4. Metody klasy Sys.Component — ciąg dalszy Nazwa metody Opis Składnia dispose Wykonuje metody obsługujące comp.dispose(); zdarzenie disposing. Usuwa właściwość _events z danego komponentu i anuluje jego rejestrację w obiekcie Sys.Application. get_events Zwraca wartość składowej _events. comp.get_events(); get_id Zwraca wartość składowej _id. comp.get_id(); set_id Ustawia wartość składowej _id. Raz comp.set_id( id); ustawionego identyfikatora nie można zmieniać (za pośrednictwem tej metody); identyfikator nie może być zmieniany także po rejestracji komponentu w obiekcie Sys.Application. add_disposing Dodaje metodę obsługującą comp.add_disposing zdarzenie disposing. ( handler); remove_disposing Usuwa metodę obsługującą comp.remove_disposing zdarzenie disposing. ( handler); add_propertyChan Dodaje metodę obsługującą comp.add_propertyChanged ged zdarzenie propertyChanged. ( handler); remove_propertyC Usuwa metodę obsługującą comp.remove_property hanged zdarzenie propertyChanged. Ćhanged ( handler); raisePropertyCha Wykonuje zarejestrowane comp.raisePropertyChanged nged metody obsługujące zdarzenie ( propertyName); propertyChanged, przekazując na ich wejściu (w formie argumentów zdarzenia) nazwę zmodyfikowanej właściwości. WSKAZÓWKA Metody beginUpdate, endUpdate oraz initialize Metody beginUpdate, endUpdate oraz initialize są wykonywane automatycznie w ramach procesu tworzenia komponentu. Wymienione metody z reguły nie są wy-woływane z poziomu kodu zdefiniowanego przez użytkownika, ale można je przykryć, aby umieścić w nich jakąś niestandardową funkcjonalność. 148 Rozdział 3. Komponenty Definiowanie nowych komponentów Klasa Sys.Component jest niezwykle przydatna, jednak jej celem nie jest bezpośrednie tworzenie egzemplarzy tego typu. Przeciwnie, twórcy klasy Sys.Component chcieli opra-cować typ, który będzie wykorzystywany w roli klasy bazowej dla komponentów definio-wanych przez użytkowników. Nowy typ komponentu możemy zdefiniować, stosując model prototypowy omówiony w rozdziale 2. i rejestrując nasz komponent jako typ dziedziczący po klasie bazowej Sys.Component. Komponent ErrorHandler Aby zademonstrować technikę definiowania nowych komponentów, utworzymy nowy, własny komponent obsługi błędów. Komponent ErrorHandler będzie odpowiadał za pu-blikowanie obsługiwanych i nieobsługiwanych błędów z wykorzystaniem specjalnej usługi danych o błędach. Szkielet Na początek utworzymy szkielet naszego nowego komponentu (patrz listing 3.1). LISTING 3.1. Definiowanie komponentu ErrorHandler /// ErrorHandler = function() { ErrorHandler.initializeBase(this); }; ErrorHandler.prototype = { initialize: function() { ErrorHandler.callBaseMethod(this, 'initialize'); }, dispose: function() { ErrorHandler.callBaseMethod(this, 'dispose'); } } ErrorHandler.registerClass('ErrorHandler', Sys.Component); Oprócz wywołania metody initializeBase w konstruktorze naszego typu i rejestracji tej klasy jako typu dziedziczącego po klasie Sys.Component zdecydowaliśmy się na przy-krycie metod initialize i dispose klasy bazowej Sys.Component. Umieściliśmy te przykryte metody w szkielecie naszego komponentu, ponieważ właśnie przykrywanie initialize i dispose jest zwykle jednym z pierwszych kroków procesu tworzenia komponentu (podobną kolejność sugerujemy także Tobie). Typ Sys.Component 149 Inicjalizacja i niszczenie komponentu Naszą szkieletową definicję należy jeszcze uzupełnić o implementacje metod initialize i dispose. W metodzie initialize konstruujemy nasz komponent. Proces konstruowania komponentu obejmuje takie kroki jak dodanie metod obsługujących zdarzenia do elementów modelu DOM, dołączenie nowego elementu DOM do drzewa i wszystkie inne operacje wymagane przez konkretny typ komponentów. W metodzie dispose powinniśmy umieścić kod odpowiedzialny za zwalnianie naszego komponentu. Zwalnianie komponentu może obejmować odłączenie zdarzeń od elementu modelu DOM, zniszczenie ewentualnych utworzonych elementów DOM lub zwolnienie wszelkich innych zasobów utworzonych przez nasz komponent. WSKAZÓWKA Metodę dispose można wywołać więcej niż raz Warto tak implementować metodę dispose, aby można ją było wywoływać więcej niż raz bez ryzyka powodowania błędów czasu wykonywania. W przypadku dość złożonych aplikacji nietrudno o sytuację, w której zwalniany obiekt menedżera wywoła metodę dispose wszystkich swoich komponentów potomnych. Okazuje się jednak, że każdy z tych obiektów potomnych jest zarejestrowany także w obiekcie Sys.Application jako obiekt, który może być zwalniany (który implementuje interfejs Sys.IDisposable). Zwalniany obiekt Sys.Application automatycznie wykonuje metodę dispose każ- dego z tak zarejestrowanych obiektów — oznacza to, że metody dispose tych obiektów są wykonywane (co najmniej) dwukrotnie. Jeśli nie zachowamy należytej ostroż- ności, próby wielokrotnego wykonania metody dispose będą się kończyły błędami czasu wykonywania. Można jednak uniknąć tych problemów, stosując proste mechanizmy weryfikacji w formie wyrażeń warunkowych. Na potrzeby naszego nowego komponentu ErrorHandler należy dodać metodę obsługującą zdarzenie error obiektu window przy okazji inicjalizacji tego komponentu i usunąć tę metodę przy okazji jego zwalniania. Proponowaną implementację tego mechanizmu przedstawiono na listingu 3.2. LISTING 3.2. Dodawanie metody obsługującej zdarzenie error obiektu okna /// ErrorHandler = function () { ErrorHandler.initializeBase(this); }; ErrorHandler.prototype = { initialize: function () {
|
Wątki
|