Adobe Flex 3.
Oficjalny podrêcznik
Autorzy: Jeff Tapper, Michael Labriola,
Matthew Boles, James Talbot
T³umaczenie: Andrzej Goñda, Aleksander Lam¿a
ISBN: 978-83-246-1966-5
Tytu³ orygina³u:
Adobe Flex 3: Training from the Source
Format: B5, stron: 648
Poznaj potê¿ne mo¿liwoœci Adobe Flex 3 i twórz bogate aplikacje internetowe
• Jak tworzyæ, wdra¿aæ i debugowaæ bogate aplikacje internetowe?
• Jak u¿ywaæ jêzyka MXML do budowania uk³adu aplikacji?
• Jak tworzyæ niestandardowe komponenty interfejsu u¿ytkownika w jêzykach
MXML i ActionScript?
Adobe Flex 3 to odpowiedŸ na zapotrzebowanie programistów w zakresie tworzenia
bogatych aplikacji internetowych za pomoc¹ przyjaznych i intuicyjnych narzêdzi.
Na Flex sk³adaj¹ siê m.in.: ActionScript 3.0, zwiêkszaj¹cy wydajnoœæ i prostotê
programowania; Flash Player 9, pozwalaj¹cy na szybsz¹ pracê i wykorzystuj¹cy
mniejsz¹ iloœæ pamiêci; Flex Builder 3, udostêpniaj¹cy m.in. œwietne narzêdzia do
usuwania b³êdów i promuj¹cy najlepsze praktyki kodowania oraz programowania
aplikacji.
Ksi¹¿ka „Adobe Flex 3. Oficjalny podrêcznik” poprowadzi Ciê krok po kroku przez
proces budowania dynamicznych, interaktywnych aplikacji. Zawiera ona szczegó³owy,
wyczerpuj¹cy, praktyczny kurs tworzenia i projektowania architektury bogatych
aplikacji internetowych (RIA) w jêzykach MXML i ActionScript 3.0. Dziêki temu
podrêcznikowi nauczysz siê pracowaæ ze z³o¿onymi zbiorami danych, tworzyæ w³asne
zdarzenia niestandardowe, stosowaæ style i skórki, a tak¿e instalowaæ aplikacje w sieci
lub komputerze. Poznasz wszystkie mo¿liwoœci Fleksa i bêdziesz umia³ zastosowaæ
w praktyce nowoczesne narzêdzia, a tak¿e z ³atwoœci¹ korzystaæ z innowacyjnych
technologii.
• Technologie bogatych aplikacji internetowych
• Pulpit programu Flex Builder 3
• Obs³uga zdarzeñ i struktury danych
• U¿ywanie zdalnych danych z kontrolkami
• Tworzenie komponentów w jêzyku MXML
• Repetery ze zbiorami danych
• Tworzenie niestandardowych komponentów w jêzyku ActionScript 3.0
• Stosowanie siatek danych i generatorów elementów
• Wprowadzanie nawigacji
• Formatowanie i walidacja danych
• Zarz¹dzanie histori¹ i g³êbokie linkowanie
• Wizualizowanie danych
• Wdra¿anie aplikacji Fleksa
Skorzystaj z indywidualnych warsztatów Flex 3
i zbuduj samodzielnie wyj¹tkow¹ aplikacjê internetow¹!
Spis treści
O autorach
15
Wstęp
17
Wprowadzenie
19
Lekcja 1 Wprowadzenie do bogatych aplikacji internetowych
29
Rozwój aplikacji komputerowych ................................................................................ 29
Odejście od architektury opartej na stronie ................................................................. 31
Zalety bogatych aplikacji internetowych ......................................................................33
Menedżerowie przedsiębiorstw ...................................................................................... 33
Przedsiębiorstwa branży IT ............................................................................................. 33
Użytkownicy końcowi ..................................................................................................... 33
Technologie bogatych aplikacji internetowych ...........................................................33
Asynchroniczny JavaScript i XML (AJAX) ..................................................................34
Flash ................................................................................................................................... 35
Flex ..................................................................................................................................... 35
Windows Presentation Foundation, XAML, Silverlight i Expression ..................... 36
Czego się nauczyłeś? .......................................................................................................37
Lekcja 2 Zaczynamy
39
Wstęp do programowania aplikacji Fleksa .................................................................. 40
Tworzenie projektu i aplikacji MXML ........................................................................ 40
Pulpit programu Flex Builder 3 .....................................................................................43
Uruchamianie aplikacji ..................................................................................................46
Tworzenie drugiej strony aplikacji w trybie projektowania .......................................52
Przygotowania do następnej lekcji ................................................................................57
Czego się nauczyłeś? .......................................................................................................58
Lekcja 3 Projektowanie interfejsu użytkownika
61
Kontenery ........................................................................................................................ 61
Tworzenie układu aplikacji e-commerce w trybie projektowania ..............................62
Praca z układami opartymi na więzach ........................................................................68
Wiązanie do kontenera nadrzędnego ............................................................................69
Użycie zaawansowanych więzów ...................................................................................74
6
ADOBE FLEX 3.
Oficjalny podręcznik
Praca ze stanami widoku ................................................................................................76
Sterowanie stanami widoku ............................................................................................78
Projektowanie aplikacji w trybie edycji kodu źródłowego ......................................... 80
Dodawanie stanów widoku i sterowanie nimi za pomocą MXML ...........................82
Czego się nauczyłeś? .......................................................................................................86
Lekcja 4 Stosowanie prostych kontrolek
89
Wprowadzenie do prostych kontrolek ........................................................................ 90
Wyświetlanie obrazów ....................................................................................................91
Tworzenie widoku szczegółów ...................................................................................... 94
Korzystanie z wiązania danych do powiązania struktury danych
z prostą kontrolką ..................................................................................................... 97
Wykorzystywanie kontenera układu formularzy do umieszczania
prostych kontrolek w aplikacji ................................................................................. 99
Dodawanie przycisków radiowych i pól daty do aplikacji Dashboard ................... 103
Czego się nauczyłeś? .....................................................................................................105
Lekcja 5 Obsługa zdarzeń i struktury danych
107
Zrozumienie obsługi zdarzeń ......................................................................................108
Prosty przykład ...............................................................................................................108
Obsługa zdarzenia przez funkcję języka ActionScript .............................................109
Przekazywanie danych podczas wywołania funkcji uchwytu zdarzenia ................ 110
Tworzenie struktury danych w zdarzeniu creationComplete ...................................111
Używanie danych z obiektu Event .............................................................................. 114
Tworzenie własnej klasy języka ActionScript ............................................................. 118
Tworzenie obiektu wartości .......................................................................................... 118
Tworzenie metody kreującej obiekt ............................................................................ 123
Tworzenie klas koszyka na zakupy ..............................................................................125
Czego się nauczyłeś? .....................................................................................................129
Lekcja 6 Używanie zdalnych danych XML z kontrolkami
131
Pobieranie danych XML za pośrednictwem HTTPService ....................................... 132
Tworzenie obiektu HTTPService ................................................................................. 132
Wywoływanie metody send() ........................................................................................ 133
Używanie zwróconych danych ..................................................................................... 133
Zagadnienia bezpieczeństwa ........................................................................................ 134
Pobieranie danych XML za pośrednictwem HTTPService ....................................... 135
Wypełnianie ArrayCollection danymi z HTTPService ............................................. 137
Używanie obiektów ArrayCollection .......................................................................... 137
Używanie kolekcji w roli dostawców danych ............................................................. 138
Wypełnianie kontrolki ComboBox i programowe dodawanie opcji ......................140
Używanie danych XML z kontrolką Tree ................................................................... 143
Pojęcie operatorów E4X ................................................................................................ 143
Wypełnianie kontrolki Tree danymi XML ................................................................148
Pobieranie danych XML i przekształcanie ich w kolekcję ArrayCollection
obiektów użytkownika .............................................................................................154
ADOBE FLEX 3.
7
Spis treści
Stosowanie powiązania danych ze złożonymi strukturami danych ........................157
Przekształcanie danych koszyka na zakupy ...............................................................159
Dodawanie elementów do koszyka ............................................................................. 159
Sortowanie elementów kolekcji ArrayCollection ..................................................... 160
Dodawanie elementu lub aktualizowanie ilości ........................................................ 162
Korzystanie z kursora do umieszczania elementu koszyka na zakupy .................. 164
Dodawanie przycisku Remove (usuń) ........................................................................ 171
Czego się nauczyłeś? .....................................................................................................172
Lekcja 7 Tworzenie komponentów w języku MXML
175
Wprowadzenie do komponentów języka MXML ......................................................176
Podstawy tworzenia niestandardowych komponentów ........................................... 176
Tworzenie własnego komponentu krok po kroku ....................................................177
Wykorzystanie niestandardowych komponentów w architekturze aplikacji .......179
Tworzenie komponentu aktualizującego i usuwającego informacje
o produkcie oraz jego egzemplarza ........................................................................180
Wyświetlanie informacji o produkcie po kliknięciu przycisków aktualizacji
i usuwania .................................................................................................................184
Tworzenie kolejnego obiektu wartości .......................................................................189
Tworzenie komponentu zarządzającego danymi dla wszystkich trzech aplikacji ......... 191
Używanie nowego komponentu zarządzającego danymi .........................................197
Wprowadzanie funkcji dodawania produktu ........................................................... 200
Tworzenie i używanie komponentów dla aplikacji Dashboard ...............................201
Czego się nauczyłeś? .....................................................................................................203
Lekcja 8 Używanie kontrolek i komponentów Repeater ze zbiorami danych
205
Używanie zbiorów danych .......................................................................................... 206
Komponenty HorizontalList i TileList ......................................................................207
Wprowadzenie labelFunction ......................................................................................208
Wprowadzenie właściwości itemRenderer .................................................................209
Wyświetlanie kategorii za pomocą elementów HorizontalList i itemRenderer .................210
Wyświetlanie informacji o produktach spożywczych należących
do określonej kategorii ............................................................................................214
Używanie komponentu Repeater do wykonania pętli przeszukującej
zbiór danych ..............................................................................................................214
Pobieranie danych z komponentów Repeater ........................................................... 215
Adresowanie komponentów utworzonych przez Repeater .....................................217
Wyjaśnienie różnic w wydajności komponentów TileList i Repeater ....................218
Wyświetlanie informacji o artykułach spożywczych należących
do określonej kategorii .............................................................................................218
Kodowanie stanów wyświetlających szczegółowe informacje o produkcie ........... 224
Umieszczanie produktów w koszyku na zakupy ...................................................... 227
Czego się nauczyłeś? .................................................................................................... 229
8
ADOBE FLEX 3.
Oficjalny podręcznik
Lekcja 9 Używanie zdarzeń niestandardowych
232
Korzyści ze stosowania luźno powiązanej architektury ............................................232
Wysyłanie zdarzeń ........................................................................................................233
Deklarowanie zdarzeń komponentu ..........................................................................235
Kiedy używa się klas niestandardowych zdarzeń .......................................................236
Tworzenie i używanie CategoryEvent .........................................................................237
Tworzenie i używanie klasy ProductEvent ................................................................ 240
Używanie ProductEvent do usuwania produktu z koszyka ....................................244
Wykorzystanie ProductEvent do dodawania produktu do koszyka ......................246
Zrozumienie przepływu i bąbelkowania zdarzeń ..................................................... 247
Czego się nauczyłeś? .....................................................................................................252
Lekcja 10 Tworzenie niestandardowych komponentów w języku ActionScript 3.0 255
Wprowadzenie do tworzenia komponentów w języku ActionScript 3.0 ................256
Tworzenie struktury klasy ............................................................................................257
Nadpisywanie metody createChildren() .....................................................................259
Tworzenie przycisku w języku ActionScript ..............................................................260
Używanie metody addChild() do dodawania przycisku do komponentu ............260
Co to jest chrom i rawChildren ................................................................................... 261
Używanie metod addChild() i rawChildren do dodawania elementów
do chromu ..................................................................................................................262
Ustalanie rozmiarów i pozycji komponentów we Fleksie ........................................265
Zrozumienie metody measure() ................................................................................. 267
Nadpisywanie metody updateDisplayList() .............................................................. 267
Czego się nauczyłeś? .....................................................................................................273
Lekcja 11 Stosowanie siatek danych i rendererów elementów
276
Wprowadzenie do siatek danych i rendererów elementów ...................................... 277
Dodawanie standardowej siatki danych do komponentu ChartPod ..................... 277
Dodawanie wywołań HTTPService do aplikacji Dashboard ................................... 278
Wyświetlanie koszyka na zakupy w siatce danych .................................................... 282
Dodawanie kontrolek edycji w siatce do DataGridColumn ...................................284
Tworzenie renderera elementów służącego do wyświetlania informacji
o produkcie ................................................................................................................285
Tworzenie lokalnego renderera elementów w celu wyświetlenia
przycisku Remove .....................................................................................................287
Aktualizowanie ShoppingCartItem funkcjami Set i Get .........................................292
Używanie zaawansowanej siatki danych .....................................................................293
Sortowanie AdvancedDataGrid ...................................................................................294
Sortowanie w trybie zaawansowanym .........................................................................295
Nadawanie stylów zaawansowanej siatce danych ......................................................296
Grupowanie danych ......................................................................................................300
Wyświetlanie danych podsumowujących ...................................................................305
Czego się nauczyłeś? ..................................................................................................... 313
ADOBE FLEX 3.
9
Spis treści
Lekcja 12 Używanie techniki „przeciągnij i upuść”
315
Wprowadzenie do menedżera przeciągania i upuszczania ....................................... 316
Przeciąganie i upuszczanie pomiędzy dwiema siatkami danych ............................. 317
Przeciąganie i upuszczanie między siatką danych i listą ...........................................320
Używanie komponentu z wyłączonym przeciąganiem w operacji przeciągania
i upuszczania ............................................................................................................324
Przeciąganie produktu do koszyka na zakupy ...........................................................329
Czego się nauczyłeś? .....................................................................................................334
Lekcja 13 Wprowadzanie nawigacji
337
Wprowadzenie do nawigacji ........................................................................................337
Używanie komponentu TabNavigator w aplikacji DataEntry .................................340
Dodawanie strony głównej i strony płatności w aplikacji e-commerce ...................343
Przygotowywanie pierwszego etapu procesu płatności wyświetlanego w ViewStack ........ 346
Wykorzystanie komponentu ViewStack do finalizacji płatności ............................353
Czego się nauczyłeś? .....................................................................................................358
Lekcja 14 Formatowanie i walidacja danych
361
Podstawowe informacje o klasach formatujących i walidujących ........................... 361
Wykorzystanie klasy Formatter do wyświetlania informacji o walucie ..................362
Korzystanie z klas walidatorów ...................................................................................366
Sprawdzanie poprawności danych za pomocą wyrażeń regularnych (część 1.) ..............368
Sprawdzanie poprawności danych za pomocą wyrażeń regularnych (część 2.) .............370
Tworzenie własnej klasy walidatora ............................................................................373
Czego się nauczyłeś? .....................................................................................................377
Lekcja 15 Zarządzanie historią i głębokie linkowanie
379
Wprowadzenie do zarządzania historią .....................................................................380
Implementowanie zarządzania historią w kontenerze nawigacyjnym ....................382
Tworzenie własnego mechanizmu zarządzania historią ...............................................383
Wprowadzenie do głębokiego linkowania .................................................................388
Głębokie linkowanie we Fleksie 3 ................................................................................388
Wykorzystanie techniki głębokiego linkowania w aplikacji ....................................388
Czego się nauczyłeś? .....................................................................................................393
Lekcja 16 Zmiana wyglądu aplikacji
396
Projekty oparte na stylach i skórkach .........................................................................396
Stosowanie stylów .........................................................................................................397
Nadawanie stylów przez atrybuty znaczników ..........................................................398
Dziedziczenie stylów .....................................................................................................400
Nadawanie stylów za pomocą znacznika <mx:Style> ...............................................400
Korzystanie z narzędzi wspomagających pracę ze stylami .......................................403
Nadawanie stylów za pomocą plików CSS .................................................................404
10
ADOBE FLEX 3.
Oficjalny podręcznik
Zmiana stylów w trakcie działania aplikacji ..............................................................414
Korzyści płynące z wczytywania stylów ......................................................................414
Tworzenie pliku SWF z arkusza CSS ...........................................................................414
Wczytywanie arkusza stylów za pomocą klasy StyleManager .................................414
Przesłanianie stylów we wczytanych plikach CSS ..................................................... 415
Tworzenie skórek dla komponentów ..........................................................................415
Skórki graficzne .............................................................................................................. 416
Importowanie skórek utworzonych w narzędziach z pakietu CS3 ......................... 416
Skórki programistyczne ................................................................................................419
Czego się nauczyłeś? .....................................................................................................423
Lekcja 17 Korzystanie z usług sieciowych
426
Komunikacja z serwerem ............................................................................................ 427
Stosowanie wywołań zdalnego modelu zdarzeń ....................................................... 428
Konfigurowanie aplikacji do lokalnej pracy ............................................................. 428
Wykorzystanie usług sieciowych w aplikacji Dashboard ......................................... 429
Obsługa wyników dostarczanych przez usługi sieciowe ..........................................432
Wywoływanie metod usług sieciowych .......................................................................434
Wykorzystanie usług sieciowych w aplikacji DataEntry ...........................................436
Korzystanie z kreatora Web Service Introspection ...................................................441
Korzystanie z wygenerowanego kodu w aplikacjach .................................................443
Refaktoryzacja we Flex Builderze ................................................................................445
Finalizowanie łączenia wygenerowanego kodu z aplikacją ..................................... 446
Uaktualnianie i usuwanie produktów ....................................................................... 447
Czego się nauczyłeś? .................................................................................................... 449
Lekcja 18 Dostęp do obiektów po stronie serwera
451
Przesyłanie plików na serwer .......................................................................................452
Integrowanie komponentu FileUpload z aplikacją DataEntry ..............................455
Korzystanie z klasy RemoteObject do zapisywania zamówienia .............................457
Aktualizowanie argumentów kompilatora Flex ........................................................459
Rozgłaszanie zdarzenia potwierdzającego proces zamawiania ...............................460
Tworzenie i wywoływanie obiektów RemoteObject .................................................460
Przekazywanie obiektu ShoppingCart do komponentu Checkout .......................464
Przywracanie aplikacji do stanu początkowego .........................................................464
Mapowanie obiektów ActionScript na obiekty serwera ........................................... 464
Kreatory dostępu do danych ....................................................................................... 467
Tworzenie projektu serwera ..........................................................................................468
Czego się nauczyłeś? .....................................................................................................471
Lekcja 19 Wizualizowanie danych
473
Komponenty wykresów we Fleksie ............................................................................. 474
Typy wykresów ................................................................................................................474
Pakiety z komponentami wykresów ............................................................................474
Elementy wykresu ..........................................................................................................475
Przygotowanie wykresów ............................................................................................. 476
ADOBE FLEX 3.
11
Spis treści
Wypełnianie wykresów danymi .................................................................................. 477
Określanie serii danych dla wykresu ...........................................................................478
Dodawanie poziomych i pionowych osi do wykresów liniowych
i kolumnowych ..........................................................................................................483
Dodawanie legendy do wykresu ................................................................................. 489
Ograniczanie liczby etykiet wyświetlanych na osi .................................................... 490
Interaktywność wykresów ............................................................................................491
Zdarzenia związane ze wskaźnikiem myszy ...............................................................492
Zdarzenia związane z klikaniem ..................................................................................492
Zdarzenia związane z zaznaczaniem ...........................................................................492
Dodawanie zdarzeń do wykresów .............................................................................. 492
Dodawanie animacji do wykresów ............................................................................. 496
Personalizowanie wyglądu wykresu za pomocą stylów ............................................ 498
Czego się nauczyłeś? .....................................................................................................500
Lekcja 20 Tworzenie aplikacji modułowych
503
Wprowadzenie do tworzenia modułowych aplikacji we Fleksie ..............................503
Korzystanie z modułów Fleksa ....................................................................................505
Korzystanie z klasy modułu .........................................................................................505
Wprowadzenie znacznika ModuleLoader ..................................................................507
Mechanizm RSL ............................................................................................................508
Zadania konsolidatora .................................................................................................. 510
Przechowywanie bibliotek RSL ................................................................................... 511
Cel przechowywania bibliotek ......................................................................................511
Podpisane i niepodpisane biblioteki RSL .................................................................. 512
Kontrolowanie bieżącego rozmiaru aplikacji ............................................................ 512
Dostosowanie aplikacji do korzystania z bibliotek RSL .......................................... 513
Skontrolowanie zmian dokonanych przez zastosowanie bibliotek RSL ............... 514
Tworzenie projektu biblioteki ..................................................................................... 515
Dodawanie do biblioteki klas i danych ...................................................................... 515
Wykorzystanie biblioteki w aplikacji FlexGrocer ..................................................... 516
Czego się nauczyłeś? .....................................................................................................517
Lekcja 21 Wdrażanie aplikacji Fleksa
519
Kompilowanie wdrożeniowej wersji aplikacji ............................................................520
Porzucenie okna przeglądarki i przejście do AIR ......................................................520
Rozpoczęcie pracy ze środowiskiem AIR ................................................................... 521
Instalowanie środowiska uruchomieniowego AIR ................................................... 521
Instalowanie pierwszej aplikacji ...................................................................................522
Tworzenie aplikacji AIR ...............................................................................................523
Tworzenie nowego projektu AIR .................................................................................523
Przenoszenie aplikacji Dashboard do projektu AIR ................................................525
Dostosowanie aplikacji za pomocą pliku XML .........................................................526
Eksportowanie pliku AIR .............................................................................................529
Czego się nauczyłeś? .....................................................................................................533
12
ADOBE FLEX 3.
Oficjalny podręcznik
Lekcja 22 Tworzenie przejść i zachowań
535
Wprowadzenie do zachowań i przejść ........................................................................535
Wykorzystanie zachowań w komponentach .............................................................. 536
Wykorzystanie przejść w stanach aplikacji .................................................................538
Implementowanie efektów w komponencie ..............................................................539
Dodawanie efektów do stanów aplikacji ....................................................................541
Czego się nauczyłeś? .....................................................................................................542
Lekcja 23 Drukowanie we Fleksie
546
Wprowadzenie do drukowania we Fleksie ..................................................................547
Pierwszy wydruk z Fleksa .............................................................................................547
Korzystanie z klasy PrintDataGrid w niewidocznych kontenerach ........................549
Tworzenie widoku drukowania w osobnym komponencie ....................................553
Skalowanie drukowanego dokumentu .......................................................................555
Drukowanie potwierdzenia procesu zamawiania ......................................................559
Czego się nauczyłeś? .....................................................................................................562
Lekcja 24 Stosowanie obiektów współdzielonych
565
Wprowadzenie do obiektów współdzielonych ..........................................................565
Tworzenie obiektów współdzielonych ........................................................................566
Odczytywanie obiektów współdzielonych .................................................................568
Tworzenie obiektu współdzielonego przechowującego zawartość koszyka ............569
Odczytywanie danych z istniejącego obiektu współdzielonego ..............................571
Czego się nauczyłeś? .....................................................................................................574
Lekcja 25 Debugowanie aplikacji we Fleksie
577
Wprowadzenie do technik debugowania ...................................................................577
Śledzenie wymiany danych między klientem a serwerem .........................................578
Zaawansowane korzystanie z debugera .......................................................................579
Więcej na temat ustawiania pułapek ...........................................................................579
Inspekcja zmiennych i powiązanych wartości ...........................................................580
Obsługa błędów za pomocą instrukcji try-catch ........................................................586
Korzystanie z instrukcji try-catch ................................................................................587
Występujące typy błędów ..............................................................................................588
Korzystanie z wielu bloków catch ...............................................................................588
Przykład wykonywania tylko jednego bloku catch ...................................................589
Przykład niewłaściwego zastosowania klasy Error w pierwszym bloku catch ..............590
Korzystanie z instrukcji finally ....................................................................................590
Korzystanie z instrukcji throw ..................................................................................... 591
Tworzenie własnych klas błędów .................................................................................592
Czego się nauczyłeś? .....................................................................................................594
Lekcja 26 Profilowanie aplikacji Fleksa
597
Wykorzystanie pamięci przez Flash Player ................................................................598
Alokowanie pamięci we Flash Playerze .......................................................................598
Przekazywanie przez referencję lub przez wartość ....................................................598
ADOBE FLEX 3.
13
Spis treści
Mechanizm oczyszczający pamięć we Flash Playerze ...............................................599
Oczyszczanie pamięci ....................................................................................................602
Profilowanie pamięci w aplikacjach Fleksa ............................................................... 604
Omówienie aplikacji ProfilerTest ................................................................................605
Profilowanie aplikacji ProfilerTest ..............................................................................607
Poprawianie klasy ImageDisplay ..................................................................................611
Profilowanie wydajności aplikacji Fleksa ...................................................................612
Profilowanie aplikacji ProfilerTest .............................................................................. 613
Poprawianie klasy ProfilerTest ..................................................................................... 615
Czego się nauczyłeś? ..................................................................................................... 615
Dodatek A Instalowanie oprogramowania
618
Skorowidz
621
5 Obs#uga zdarze(
i struktury danych
Wa n! cz#$ci! tworzenia bogatych aplikacji internetowych jest zbudowanie efektywnej architektury
po stronie klienta. Za pomoc! programu Flash Player do tworzenia aplikacji mo na u y& opartego
na zdarzeniach modelu programowania, tworzy& bogate modele danych po stronie klienta i tworzy&
logiczne aplikacje, post#puj!c wed'ug dobrych praktyk programowania zorientowanego obiektowo.
Ten typ projektowania ró ni si# bardzo od metod stosowanych przez programistów aplikacji siecio-
wych, poniewa nie korzysta si# w nim z modelu projektowania opartego na stronie, sterowanego
przep'ywem. Korzystanie z opartej na zdarzeniach architektury po stronie klienta skutkuje lepiej
dzia'aj!cymi aplikacjami, w mniejszym stopniu obci! aj!cymi sie&, poniewa nie jest konieczne ci!g'e
od$wie anie strony. W tej lekcji zastosujemy techniki programowania opartego na zdarzeniach
z niestandardowymi klasami ActionSriptu we Fleksie.
Uko!czona struktura danych FlexGrocer, utworzona w j,zyku ActionScript 3.0 i zintegrowana z aplikacj3
108
ADOBE FLEX 3.
Oficjalny podr.cznik
Zrozumienie obs#ugi zdarze(
Flex wykorzystuje model programowania oparty na zdarzeniach lub, inaczej, sterowany zdarzeniami.
Oznacza to, e zdarzenia decyduj! o przebiegu dzia'ania aplikacji. Na przyk'ad klikni#cie przez
u ytkownika przycisku lub dane zwracane z us'ugi sieciowej decyduj! o tym, co powinno nast!pi&
w aplikacji.
Zdarzenia te reprezentuj! dwa typy: zdarzenia u ytkownika (na przyk'ad klikni#cie mysz! lub wci-
$ni#cie klawisza) i systemowe (uruchomienie aplikacji i wy$wietlenie jej, wy$wietlenie niewidocznego
elementu). Programista Fleksa decyduje, co powinno wydarzy& si# po wyst!pieniu danego zdarzenia,
obs'uguje te zdarzenia i pisze kod, który ma zosta& wykonany.
Wiele osób zajmuj"cych si# programowaniem po stronie serwera przywyk$o do modelu
programowania sterowanego przep$ywem, w którym to programista decyduje o przebiegu
dzia$ania aplikacji, a nie zdarzenia systemowe i u%ytkownika.
Oddzia'ywanie u ytkownika na aplikacj# wywo'uje szereg czynno$ci:
1.
U ytkownik oddzia'uje na aplikacj#.
2.
Obiekt, na który oddzia'uje u ytkownik, tworzy zdarzenie.
3.
Zdarzenie zostaje odczytane i uchwycone.
4.
Zostaje wykonany kod powi!zany z odpowiednim uchwytem zdarzenia.
Prosty przyk#ad
Aby u'atwi& zrozumienie tematu, przyjrzyjmy si# konkretnemu przyk'adowi. Po klikni#ciu przez
u ytkownika przycisku w etykiecie pojawia si# tekst:
<mx:Label id="myL"/>
<mx:Button id="myButton"
label="Click Me"
click="myL.text='Button Clicked'"/>
Zostaje wy$wietlony przycisk z tekstem
Click Me. Po klikni#ciu przycisku przez u ytkownika zostaje
wys'ane zdarzenie. W tym przypadku zostaje wykonany kod j#zyka ActionScript —
myL.text=
'Button Clicked'
. W'a$ciwo$ci
text
etykiety zostaje przypisany 'a/cuch znakowy
Button Clicked
.
Ten fragment kodu zawiera warto$ci zagnie d one i dlatego konieczne jest u ycie zagnie d onych
cudzys'owów pojedynczych i podwójnych. Cudzys'owy podwójne otaczaj! ca'y wiersz kodu, a poje-
dyncze wyodr#bniaj! 'a/cuch.
Do tej pory przypisywali$my w'a$ciwo$ciom warto$ci skalarne lub powi!zania. Warto$ci skalarne
to proste typy danych, takie jak 'a/cuchy znakowe, liczby lub warto$ci logiczne. U ywali$my ich
na przyk'ad do okre$lania warto$ci wspó'rz#dnych
x
i
y
, szeroko$ci i warto$ci wy$wietlanych w ety-
LEKCJA 5.
109
Obs#uga zdarze( i struktury danych
kietach. Stosowali$my tak e powi!zania. By'o tak zawsze, gdy warto$& by'a umieszczona w nawiasach
klamrowych. W ostatniej lekcji nawiasy pozwala'y na wprowadzenie kodu ActionScript jako warto$ci
w'a$ciwo$ci.
Je eli w'a$ciwo$& zostaje przypisana do zdarzenia, jest ona rozumiana przez kompilator Fleksa jako
kod j#zyka ActionScript. Mo na wi#c wpisa& kod ActionScript bezpo$rednio jako warto$& zdarzenia,
pomijaj!c nawiasy. Wida& to we wcze$niejszym przyk'adowym kodzie:
click="myL.text='Button
Clicked'"
.
Podpowiadanie kodu pomaga nie tylko podczas wpisywania nazw w'a$ciwo$ci, ale tak e nazw zdarze/.
Na poni szym rysunku wida& zdarzenia
change
i
click
ze znajduj!c! si# przed nimi ikon! b'yskawicy,
która oznacza zdarzenia.
Obs#uga zdarzenia przez funkcj. j.zyka ActionScript
Po klikni#ciu przycisku kod u yty do wpisania tekstu w etykiecie dzia'a poprawnie. Pojawia si# jednak
problem, gdy trzeba wpisa& wi#cej ni dwa wiersze kodu ActionScript, który ma zosta& wykonany
w celu obs'ugi zdarzenia. Po zdarzeniu
click
nale a'oby u y& wielu wierszy kodu oddzielonych
$rednikami. Taki zapis, chocia prawid'owy, powoduje ba'agan. Po wyst!pieniu ró nych zdarze/
mo e by& wykonywany jednakowy kod. Aby zastosowa& to rozwi!zanie, trzeba skopiowa& i wklei& ten
kod w wielu miejscach, co w przypadku konieczno$ci jego edycji wymaga wprowadzenia wielu zmian.
Lepsz! metod! obs'ugiwania zdarze/ jest tworzenie funkcji w j#zyku ActionScript. Zostanie ona
umieszczona w bloku
<mx:Script>
, który informuje kompilator Fleksa, e kod w bloku
Script
jest
kodem ActionScript. Zamiast wi#c umieszcza& kod ActionScript, który ma zosta& wykonany, jako
warto$& zdarzenia
click
, lepiej jest wywo'a& funkcj#. Poni ej znajduje si# kod wykonuj!cy dok'adnie
to samo, co zaprezentowany wcze$niej. Ró nica polega na tym, e korzystano z zalecanej techniki
umieszczania kodu, który ma zosta& wykonany w odpowiedzi na zdarzenie, w funkcji.
<mx:Script>
<![CDATA[
private function clickHandler():void
{
myL.text="Button Clicked";
}
]]>
</mx:Script>
110
ADOBE FLEX 3.
Oficjalny podr.cznik
<mx:Label id="myL"/>
<mx:Button id="myButton"
label="Click Me"
click="clickHandler()"/>
Blok <!CDATA[]]> wewn"trz bloku skryptu oznacza dan" sekcj# jako dane znakowe.
Informuje on kompilator, %e zamiast kodu XML w bloku s" zawarte dane znakowe, co
zabezpiecza przed wygenerowaniem b$#dów XML dla tego bloku.
Teraz, gdy zostanie klikni#ty przycisk, zostaje wywo'ana funkcja
clickHandler()
i do etykiety zostaje
wpisany 'a/cuch znakowy. Poniewa nie ma w kodzie zagnie d onych cudzys'owów, do otoczenia
tekstu mog'y zosta& u yte cudzys'owy podwójne.
Samej funkcji zosta' nadany typ
void
. Oznacza to, e nie zwraca ona adnej warto$ci. Bardzo dobr!
praktyk! jest przypisywanie funkcjom typu, nawet je eli jest to typ
void
wskazuj!cy, e nie zostaje
zwrócona adna warto$&. Kompilator wy$wietli ostrze enie, je eli funkcji nie zostanie nadany
aden typ.
Przekazywanie danych
podczas wywo#ania funkcji uchwytu zdarzenia
Podczas wywo'ywania funkcji mo e zaistnie& potrzeba przekazania danych. W ActionScripcie dzia'a
to tak, jak mo na si# spodziewa&. Dane, które maj! zosta& przekazane, s! wpisywane wewn!trz nawia-
sów nast#puj!cych po nazwie funkcji, nast#pnie uchwyt zdarzenia musi zosta& zmodyfikowany tak,
by móg' przyj!& te dane. Parametry, tak jak funkcje, równie powinny posiada& typ, który funkcja
akceptuje.
W poni szym przyk'adzie aplikacja jest zmodyfikowana tak, e 'a/cuch znaków wy$wietlany
w etykiecie jest przekazywany do uchwytu zdarzenia jako parametr.
<mx:Script>
<![CDATA[
private function clickHandler(toDisplay:String):void
{
myL.text=toDisplay;
}
]]>
</mx:Script>
<mx:Label id="myL"/>
<mx:Button id="myButton"
label="Click Me"
click="clickHandler('Value Passed')"/>
W tym przypadku po klikni#ciu przycisku do funkcji uchwytu zdarzenia zostaje przekazany 'a/cuch
Value Passed
. Funkcja przyjmuje dane do parametru
toDisplay
, któremu zosta' nadany typ
String
.
Warto$& przechowywana w zmiennej
toDisplay
zostaje nast#pnie wy$wietlona jako w'a$ciwo$&
text
etykiety.
LEKCJA 5.
111
Obs#uga zdarze( i struktury danych
Tworzenie struktury danych
w zdarzeniu creationComplete
Zdarzenie
creationComplete
zostaje wys'ane po utworzeniu egzemplarza elementu i jego poprawnym
umieszczeniu w aplikacji. Element b#dzie widoczny w aplikacji po wyst!pieniu zdarzenia
creation
Complete
, chyba e jego w'a$ciwo$&
visible
jest ustawiona na
false
. Zdarzenie
creationComplete
obiektu g'ównego
Application
zostaje wys'ane po wys'aniu przez wszystkie jego elementy potomne
(wszystkie elementy zawarte w kontenerze
Application
) zdarze/
creationComplete
, które ich dotycz!.
Przeanalizujmy poni szy fragment kodu:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="addToTextArea('Application creationComplete')">
<mx:Script>
<![CDATA[
private function addToTextArea(eventText:String):void
{
var existingText:String=reportEvents.text;
reportEvents.text=existingText+eventText+"\n";
}
]]>
</mx:Script>
<mx:TextArea editable="false"
height="100"
width="200"
borderStyle="solid"
id="reportEvents" />
<mx:HBox creationComplete="addToTextArea('HBox creationComplete')">
<mx:Label creationComplete="addToTextArea('Label creationComplete')"/>
<mx:Button creationComplete="addToTextArea('Button creationComplete')"/>
</mx:HBox>
</mx:Application>
Spójrzmy najpierw na uchwyt zdarzenia nazwany
addToTextArea
. Przyjmuje on parametr o nazwie
eventText
i umieszcza go w obszarze tekstu, wprowadzaj!c po nim 'amanie wiersza. Dla ka dego z ele-
mentów, czyli
Application
,
HBox
,
Label
i
Button
, zostaje wywo'ane wydarzenie
creationComplete
.
Gdy proces tworzenia ka dego z elementów zostaje zako/czony, zdarzenie jest wysy'ane i odpo-
wiedni dla niego 'a/cuch znaków zostaje przekazany do uchwytu zdarzenia w celu wy$wietlenia
w obszarze tekstowym.
Flex nie tworzy elementów w kolejno$ci od góry do do'u. Nale y sobie wyobra a& ten proces raczej
jako tworzenie od $rodka na zewn!trz. Zdarzenia
creationComplete
s! wi#c wysy'ane najpierw przez
kontrolki
Label
i
Button
. Nast#pnie, skoro tworzenie elementów potomnych kontenera
HBox
zosta'o
zako/czone, zdarzenie
creationComplete
zostaje wys'ane przez
HBox
. W ko/cu, gdy wszystkie
elementy potomne aplikacji zosta'y utworzone, sam element
Application
mo e wys'a& zdarzenie
creationComplete
.
112
ADOBE FLEX 3.
Oficjalny podr.cznik
Wyniki wy$wietlone na ekranie w obszarze tekstowym wygl!daj! tak, jak te zaprezentowane poni ej.
Teraz ju rozumiesz, dlaczego zdarzenie
creationComplete
obiektu
Application
jest cz#sto wyko-
rzystywane do pobierania danych. Kiedy wszystkie obiekty potomne obiektu
Application
zostan!
ju utworzone, nadchodzi odpowiedni moment na !danie danych z zewn#trznego 1ród'a i wyko-
rzystanie ich.
W nast#pnym &wiczeniu wprowadzimy dwie du e zmiany: utworzymy odwo'anie do pliku zewn#trz-
nego b#d!cego 1ród'em danych, które zostan! osadzone w aplikacji, oraz zastosujemy uchwyt zda-
rzenia do $ledzenia niektórych danych w celu upewnienia si#, e s! one poprawnie pobierane.
Najpierw zostanie okre$lony zewn#trzny model XML dla znacznika
<mx:Model>
. Nast#pnie zdarzenie
creationComplete
zostanie wykorzystane do wywo'ania metody lub funkcji, która za pomoc!
w'asnej klasy ActionScript ostatecznie utworzy pojedyncze obiekty warto$ci.
1.
W programie Flex Builder otwórz plik
src\assets\inventory.xml.
Plik ten jest zbiorem danych u ytych w poprzedniej lekcji, tylko e obecnie jest plikiem
zewn#trznym.
2.
Otwórz plik
EComm.mxml, z którym pracowa'e$ w poprzedniej lekcji. Je eli jej nie uko/czy'e$,
mo esz go otworzy& z katalogu
Lekcja05\start i zapisa& go w swoim folderze flexGrocer\src.
3.
Usu/ w#z'y potomne ze znacznika
<mx:Model>
oraz znacznik zamykaj!cy
</mx:Model>
.
4.
Dodaj na ko/cu znacznika
<mx:Model>
uko$nik zamykaj!cy:
<mx:Model id="groceryInventory" />
5.
Wewn!trz znacznika
<mx:Model>
wska zewn#trzny plik XML, okre$laj!c warto$& atrybutu
source
jako
"assets\inventory.xml"
:
<mx:Model id="groceryInventory" source="assets/inventory.xml"/>
Znacznik
<mx:Model>
automatycznie przeprowadzi analiz# sk'adniow! danych z zewn#trznego
pliku XML do pierwotnej postaci struktury danych ActionScriptu — w tym przypadku
obiektu. W lekcji 6., „U ywanie zdalnych danych XML z kontrolkami”, napiszemy wi#cej
o bardziej z'o onych strukturach danych.
6.
Do znacznika
<mx:Application>
dodaj zdarzenie
creationComplete
i spraw, by wywo'ywa'o
ono funkcj# uchwytu zdarzenia o nazwie
prodHandler()
, tak jak poni ej:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="prodHandler()">
LEKCJA 5.
113
Obs#uga zdarze( i struktury danych
Jak ju wyja$nili$my, je eli zdarzenie
creationComplete
znajduje si# w znaczniku
<mx:Application>
, zostaje ono wys'ane dopiero po utworzeniu wszystkich elementów
potomnych tego znacznika. Jest to korzystne, poniewa oznacza, e wszystkie elementy
aplikacji s! ju gotowe do u ycia.
7.
Prze$lij do funkcji
prodHandler()
struktur# danych utworzon! w znaczniku
<mx:Model>
—
groceryInventory
:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="prodHandler(groceryInventory)">
Identyfikator znacznika
<mx:Model>
jest równy
groceryInventory
. Znacznik ten utworzy'
automatycznie z pliku XML prosty obiekt j#zyka ActionScript i mo e zosta& teraz wykorzystany
do wi!zania danych.
Je%eli zosta$a utworzona zmienna lub funkcja, podczas wpisywania znacznika dost#pna
jest pomoc. W tym przypadku, wprowadzaj"c nazw# zmiennej groceryInventory jako
parametr funkcji, mo%na wpisa+ gr, nast#pnie wcisn"+ Ctrl+spacja i wybra+ nazw#
zmiennej z listy.
8.
Zaraz po istniej!cym znaczniku
<mx:Model>
dodaj blok
<mx:Script>
. Zauwa , e Flex Builder
automatycznie dodaje znacznik
CDATA
. U góry bloku skryptu zdefiniuj funkcj# prywatn! typu
void
o nazwie
prodHandler()
. Musi ona przyjmowa& parametr typu
Object
o nazwie
theItems
.
<mx:Script>
<![CDATA[
private function prodHandler(theItems:Object):void
{
}
]]>
</mx:/Script>
Funkcja
prodHandler()
jest uchwytem zdarzenia
creationComplete
. Zosta'a okre$lona jako
prywatna, co oznacza, e mo e by& u ywana tylko wewn!trz klasy. Funkcja b#dzie przyjmowa'a
pojedynczy parametr typu
Object
oraz nie b#dzie zwraca'a adnej warto$ci, poniewa jako
typ zwracany zosta' okre$lony
void
.
9.
Wewn!trz funkcji
prodHandler()
dodaj dwa wyra enia
trace
, wy$wietlaj!ce nazw# i koszt
elementów przekazywanych do funkcji.
private function(prodHandler(theItems:Object):void
{
trace (theItems.prodName);
trace(theItems.cost);
}
10.
Kliknij narz#dzie
Debug, aby skompilowa& aplikacj#. Wró& do Flex Buildera.
W widoku
Console zostan! wy$wietlone wyniki dzia'ania wyra e/
trace
. W oknie konsoli powinna
by& widoczna nazwa produktu i jego koszt. B#dziesz musia' zminimalizowa& wy$wietlone okno
przegl!darki oraz wybra& z menu opcj#
Window/Console, je eli widok Console nie jest wy$wietlany.
(Zobacz rysunek na nast#pnej stronie).
114
ADOBE FLEX 3.
Oficjalny podr.cznik
U=ywanie danych z obiektu Event
Flex tworzy obiekt
Event
za ka dym razem, gdy zostaje wys'ane zdarzenie. Obiekt ten zawiera in-
formacje o zdarzeniu, które nast!pi'o. Jest tworzony automatycznie nawet wtedy, gdy nie zostanie
wykorzystany. B#dzie jednak cz#sto stosowany. Zwykle obiekt zdarzenia jest wysy'any do uchwytu
zdarzenia i odczytywane s! z niego w'a$ciwo$ci.
Istnieje bardzo wiele rodzajów obiektów zdarze/, których mo na u y&. Ogólny obiekt
Event
jest
zdefiniowany w klasie j#zyka ActionScript. Ta ogólna wersja nie b#dzie jednak dzia'a'a we wszyst-
kich zdarzeniach. Mo na si# domy$li&, e najwa niejsza informacja zwrócona ze zdarzenia „prze-
ci!gni#cia i upuszczenia” b#dzie ró na od najwa niejszej informacji zwróconej po zako/czeniu
wywo'ania us'ugi sieciowej. Z tego powodu ogólna klasa
Event
stanowi podstaw# dla wielu innych klas
zdarze/. Na poni szym rysunku wida&, jak wiele innych klas jest opartych na ogólnej klasie
Event
lub stanowi jej podklasy.
Czy wszystkie te obiekty zdarze/ s! potrzebne? Potrzebne s! te zawieraj!ce wszystkie potrzebne
informacje, ale nie ich nadmiar.
Ogólny obiekt
Event
zawiera w'a$ciwo$ci u yte we wszystkich obiektach typu zdarzenie. Dwa 'atwe
do zrozumienia typy to
type
i
target
. W'a$ciwo$&
type
zdarzenia jest 'a/cuchem zawieraj!cym
nazw# uchwyconego zdarzenia, na przyk'ad
click
lub
creationComplete
. W'a$ciwo$&
target
wskazuje element, który wys'a' zdarzenie, na przyk'ad element
Button
, je eli zdarzenie zosta'o
wys'ane przed klikni#ciem przycisku.
Target (cel) mo%e wydawa+ si# dziwnym okre0leniem tej w$a0ciwo0ci, skoro jest to
zdarzenie, które wys$a$o inne zdarzenie, a nie cel czegokolwiek. Wyja0ni si# to w lekcji 9.,
„Stosowanie zdarze4 u%ytkownika”, i gdy dowiesz si# czego0 o przep$ywie zdarze4.
LEKCJA 5.
115
Obs#uga zdarze( i struktury danych
Przyjrzyjmy si# poni szemu kodowi, który wysy'a obiekt zdarzenia, w tym przypadku obiekt
MouseEvent
, do uchwytu zdarzenia.
<mx:Script>
<![CDATA[
private function clickHandler(event:MouseEvent):void
{
trace(event.type);
}
]]>
</mx/Script>
<mx:Label id="myL"/>
<mx:Button id="myButton"
label="Click Me"
click="clickHandler(event)"/>
W powy szym kodzie zdarzenie zostaje wys'ane do uchwytu zdarzenia i podczas debugowania
aplikacji w widoku
Console zostaje wy$wietlone s'owo
click
.
Chocia obiekt
Event
nie jest u ywany w adnym miejscu tworzonych obecnie aplikacji, zrozumienie,
do czego s'u y, jest niezb#dne. W zwi!zku z tym, chocia obiekt ten nie jest zawarty w adnej z trzech
aplikacji tworzonych podczas pracy z ksi! k!, w poni szym &wiczeniu zastosujemy go.
1.
Wybierz z menu
File/New/Flex Project. Nadaj projektowi nazw# EventObject.
2.
Ustal lokalizacj# pliku projektu jako
flexop\Lekcja05\eventObject\start.
3.
Jako typ aplikacji wybierz
Web application.
4.
Ustaw technologi# serwera jako
none
, a nast#pnie kliknij
Next.
5.
Pozostaw typ folderu wyj$ciowego
bin-debug
i kliknij
Next.
6.
Pozostaw
src jako g'ówny folder 1ród'owy.
7.
Przeszukaj opcj#
Main application file i zaznacz EventTest.mxml. Kliknij Finish.
W'a$nie utworzy'e$ projekt. Mo esz uruchomi& aplikacj#, która b#dzie wykorzystywana
do eksperymentowania z obiektem zdarzenia. Plik ten jest tylko szkieletem aplikacji z dodanym
blokiem
Script
.
8.
Dodaj przycisk pomi#dzy zamykaj!cym znacznikiem
</mx:Script>
a ko/cem aplikacji.
Nadaj przyciskowi za pomoc! w'a$ciwo$ci
id
nazw# egzemplarza
myButton
. Dodaj w'a$ciwo$&
label
o warto$ci
Click To Debug
. Dodaj zdarzenie
click
i spowoduj, by wywo'ywa'o ono
uchwyt zdarzenia o nazwie
doClick()
, przesy'aj!cy obiekt zdarzenia w formie parametru:
<mx:Button id="myButton" label="Click To Debug" click="doClick(event)"/>
Kiedy zostanie klikni#ty przycisk, zostanie wywo'ana funkcja
doClick()
i zostanie do niej
wys'any obiekt
event
.
9.
W bloku skryptu dodaj prywatn! funkcj# typu
void
o nazwie
doClick()
. Przyjmij parametr
typu
MouseEvent
o nazwie
event
, tak jak poni ej:
116
ADOBE FLEX 3.
Oficjalny podr.cznik
private function doClick(event:MouseEvent):void
{
}
Mo%na przyj"+ spójne nazewnictwo dla uchwytów zdarze4. Na przyk$ad w tej lekcji u%ywane
jest zdarzenie click obs$ugiwane przez uchwyty zdarze4 o nazwach clickHandler()
i doClick(). Nie istnieje jedyna s$uszna metoda nadawania nazw uchwytom zdarze4,
mo%na jednak wybra+ sobie konwencj# nazewnictwa i trzyma+ si# jej.
W nast#pnym kroku u yjemy wbudowanego w program Flex Builder debugera w najprostszy
sposób. Debuger zostanie dok'adnie omówiony w lekcji 25., „Debugowanie aplikacji
we Fleksie”. Tutaj u yjemy go do przyjrzenia si# obiektowi zdarzenia.
10.
Dodaj punkt przerwania programu na zamykaj!cym funkcj# nawiasie klamrowym, dwukrotnie
klikaj!c pasek znaczników po lewej stronie kodu i numerów wierszy. Na pasku pojawi si#
ma'y niebieski punkt wskazuj!cy miejsce, w którym zostanie wstrzymane wykonanie programu.
W tym punkcie mo na przyjrze& si# aktualnym warto$ciom.
Debuger jest niesamowicie pomocny w zrozumieniu tego, co dzieje si# w aplikacji Fleksa,
dlatego warto cz#sto go u ywa&.
11.
Kliknij przycisk
Debug interfejsu programu Flex Builder.
12.
W przegl!darce kliknij przycisk z etykiet!
Click To Debug
. We Flex Builderze zostaniesz
poproszony o skorzystanie z perspektywy
Debugging. Powiniene$ to zrobi&.
13.
Kliknij dwukrotnie belk# widoku
Variables, aby wy$wietli& j! w trybie pe'noekranowym.
Okno zawiera wiele informacji i przej$cie do widoku pe'noekranowego u'atwi ich przegl!danie.
14.
Zostan! wy$wietlone dwie zmienne:
this
i
event
(tak jak poni ej).
LEKCJA 5.
117
Obs#uga zdarze( i struktury danych
Zmienna
this
reprezentuje ca'! aplikacj#. Je eli klikniesz znajduj!cy si# przed ni! znak
+,
zobaczysz wiele w'a$ciwo$ci i skojarzonych warto$ci. Zmienna
event
reprezentuje zmienn!
zdarzenia lokaln! dla funkcji, w której zosta' wstawiony punkt przerwania. Litera
L
umieszczona
w ikonie po lewej stronie zmiennej
event
wskazuje, e jest to zmienna lokalna.
15.
Kliknij znak
+ przed zmienn!
event
, a nast#pnie znak
+ przed zestawem w'a$ciwo$ci
[inherited]
. Znajd1 w'a$ciwo$&
target
. Zwró& uwag#, e
target
jest elementem
wysy'aj!cym zdarzenie
Button
. Zauwa tak e, e w'a$ciwo$&
type
ma warto$&
click
.
Wszystkie te warto$ci zosta'y ju omówione.
16.
Kliknij znak
+ przed
target
, nast#pnie kliknij znak
+ przed zestawem w'a$ciwo$ci
[inherited]
i znajd1 w'a$ciwo$&
id
.
Zauwa , e warto$ci! w'a$ciwo$ci jest
myButton
, tak jak zosta'o to wpisane w kodzie.
17.
Przywró& widok
Variables, klikaj!c dwukrotnie jego belk#. Kliknij czerwony kwadracik
w widoku
Debug lub Console, by zako/czy& debugowanie.
Nie zapominaj o tym, aby zako/czy& sesj# debugowania. Mo liwe jest dzia'anie jednej sesji
debugowania w innej. Mo e by& to przydatne w pewnych przypadkach, nie jest jednak zalecane.
18.
Wró& do perspektywy
Development, klikaj!c znak >> w prawym górnym rogu ekranu
i wybieraj!c
Flex Development.
Je%eli umie0cisz kursor z lewej strony ikony Open Perspective, pojawi si# podwójna strza$ka.
Mo%esz klikn"+ i przeci"gn"+ okno w lewo w celu zwi#kszenia ilo0ci miejsca przydzielonego
perspektywom. B#dzie widoczna zarówno perspektywa Development, jak i Debugging,
i b#dzie mo%na $atwo prze$"cza+ si# mi#dzy nimi, klikaj"c ich zak$adki.
19.
Zamknij projekt
EventObject i wró& do projektu FlexGrocer.
118
ADOBE FLEX 3.
Oficjalny podr.cznik
Tworzenie w#asnej klasy j.zyka ActionScript
Jak wspomniano pod koniec lekcji 2., ksi! ka ta nie jest podr#cznikiem programowania zoriento-
wanego obiektowo, ka dy programista Fleksa musi jednak chocia w podstawowym stopniu zna&
specjalistyczn! terminologi#. Je eli wi#c nie s! Ci znane takie wyra enia, jak
klasa, obiekt, w@aAciwoAB
i
metoda, nadszed' najwy szy czas, by skorzysta& z setek, je eli nie tysi#cy, publikacji wprowadzaj!-
cych do programowania zorientowanego obiektowo.
Tworzyli$my ju w'asne klasy j#zyka ActionScript podczas pracy z t! ksi! k!, cho& mog'e$ o tym nie
wiedzie&, poniewa Flex ukrywa je przed programist!. Podczas tworzenia aplikacji w j#zyku MXML
tworzymy tak naprawd# now! klas# j#zyka ActionScript. Kod MXML jest po'!czony z kodem
ActionScript w bloku skryptu i jest tworzona czysta klasa j#zyka ActionScript skompilowana do
pliku
.swf, gotowego do u ycia przez program Flash Player. W ostatnim &wiczeniu po utworzeniu
EventTest.mxml powsta' wi#c plik EventTest-generated.as zawieraj!cy poni szy kod:
public class EventTest extends mx.core.Application
W wyniku utworzenia
EventTest.mxml zosta'a rozszerzona klasa
Application
, tak jak w wyniku
utworzenia ka dej z aplikacji w tej ksi! ce.
Aby widzie+ tworzony kod j#zyka ActionScript, nale%y doda+ argument kompilatora we
Flex Builderze. Przejd; do Project/Properties/Flex Compiler/Additional compiler arguments
(projekt/w$a0ciwo0ci/kompilator Fleksa/dodatkowe argumenty kompilatora) i dodaj na
ko4cu istniej"cych argumentów tekst -keep-generated-actionscript. W projekcie
zostanie automatycznie utworzony katalog generated, a w nim — wiele plików j#zyka
ActionScript. Aktualne pliki aplikacji znajduj" si# w formularzu Name-generated.as. Nie
zapomnij o usuni#ciu argumentu kompilatora po zako4czeniu sprawdzania.
W tej cz#$ci lekcji zbudujemy klasy j#zyka ActionScript bezpo$rednio w tym j#zyku, nie korzystaj!c
z konwersji kodu MXML na kod ActionScript przez Fleksa.
Po co si# to robi? Tworzenie klas j#zyka ActionScript jest niezb#dne do wykonania niektórych &wi-
cze/ przedstawionych w tej ksi! ce, wliczaj!c w to tworzenie w'asnych klas zdarze/ oraz obiektów
warto$ci. Niedawno poznali$my obiekty zdarze/. W lekcji 9. utworzymy obiekty zdarze/ do prze-
chowywania okre$lonych danych i tworzenie w'asnych klas j#zyka ActionScript b#dzie wówczas
konieczne.
Tworzenie obiektu warto@ci
Obiekty wartoAci (value objects, nazywane równie obiektami transferu danych — DTO), lub po prostu obiekty
transferu, przechowuj! dowolne dane zwi!zane z obiektem, nie zawieraj! szczegó'owego kodu i logiki
biznesowej oraz s! wdro one jako klasy ActionScript.
Nazwa obiektów transferu jest zwi!zana z tym, e cz#sto s'u ! one do przesy'ania danych do zaplecza
aplikacji w celu zachowania ich na sta'e w bazie danych. W tej lekcji utworzymy obiekty warto$ci dla
produktów spo ywczych, produktu przeniesionego do koszyka na zakupy oraz samego koszyka.
LEKCJA 5.
119
Obs#uga zdarze( i struktury danych
Najpierw jednak omówimy podstawy tworzenia klasy j#zyka ActionScript. Poni ej zosta'a poka-
zana bardzo prosta klasa:
W linii A wyra enie
package
reprezentuje struktur# katalogu, w którym jest przechowywana klasa.
Plik jest przechowywany w katalogu
grocery/product w strukturze plików aplikacji.
W linii B klasie zostaje nadana nazwa
Fruit
. Musi to odpowiada& nazwie pliku —
Fruit.as.
W linii C zosta'y zadeklarowane w'asno$ci klasy. Mo e ich by& wiele.
Linia D zawiera konstruktor klasy. Jest on wywo'ywany automatycznie, gdy tworzony jest nowy
egzemplarz obiektu klasy. Nazwa funkcji konstruktora klasy musi by& taka sama jak nazwa klasy,
która z kolei jest taka sama jak nazwa pliku. Funkcja ta musi by& funkcj! publiczn! i nie mo e mie&
nadanego typu.
W linii E zosta'y zdefiniowane metody klasy. Mo e zosta& zadeklarowanych wiele metod.
W aplikacji FlexGrocer trzeba zarz!dza& wielkimi ilo$ciami danych i przesy'a& je do innych apli-
kacji. W kolejnym &wiczeniu utworzymy obiekt warto$ci przechowuj!cy informacje o produkcie
spo ywczym.
1.
Utwórz nowy plik klasy j#zyka ActionScript, wybieraj!c z menu
File/New/ActionScript class
(plik/nowy/klasa ActionScript). W polu
Package wpisz
valueObjects
, co spowoduje
automatyczne utworzenie przez Flex Builder katalogu o tej samej nazwie. Nazwij klas#
Product
i pozostaw warto$ci domy$lne wszystkich pozosta'ych pól. Kliknij
Finish, aby
utworzy& plik.
Zostaje utworzony plik o nazwie
Product.as, zawieraj!cy podstawow! struktur# klasy j#zyka
ActionScript. Wyra enia
package
i
class
s! s'owami kluczowymi u ytymi w definicji tej
klasy. Nale y pami#ta&, e b#dzie ona podstaw! dla wielu obiektów u ywanych pó1niej
do opisywania ka dego z produktów spo ywczych. (Zobacz rysunek na nast#pnej stronie).
120
ADOBE FLEX 3.
Oficjalny podr.cznik
2.
W utworzonym pliku, przed s'owem kluczowym
class
, ale za s'owem kluczowym
package
,
dodaj znacznik metadanych
[Bindable]
. Wewn!trz definicji klasy
Product
dodaj w'a$ciwo$&
publiczn! typu
Number
o nazwie
catID
.
package valueObjects{
[Bindable]
public class Product{
public var catID:Number;
}
}
Je eli znacznik metadanych
[Bindable]
zostanie wstawiony przed s'owem kluczowym
class
,
oznacza, e ka da w'a$ciwo$& klasy mo e zosta& u yta w powi!zaniu (zosta& powi!zana
z kontrolk! lub inn! struktur! danych). Zamiast okre$lania ca'ej klasy jako
[Bindable]
mo na
okre$li& pojedyncze w'a$ciwo$ci. W przypadku aplikacji
FlexGrocer ka da w'a$ciwo$& powinna
by& mo liwa do powi!zania.
3.
Utwórz w'a$ciwo$ci publiczne o nazwach
prodName
(typ
String
),
unitID
(typ
Number
),
cost
(typ
Number
),
listPrice
(typ
Number
),
description
(typ
String
),
isOrganic
(typ
Boolean
),
isLowFat
(typ
Boolean
) oraz
imageName
(typ
String
). Klasa powinna wygl!da& tak:
package valueObjects{
[Bindable]
public class Product{
public var catID:Number;
LEKCJA 5.
121
Obs#uga zdarze( i struktury danych
public var prodName:String;
public var unitID:Number;
public var cost:Number;
public var listPrice:Number;
public var description:String;
public var isOrganic:Boolean;
public var isLowFat:Boolean;
public var imageName:String;
}
}
Tworzymy struktur# danych przechowuj!c! informacje magazynowe dla sklepu spo ywczego.
Powy ej utworzyli$my wszystkie w'a$ciwo$ci, które zostan! wykorzystane w tej klasie.
4.
Wewn!trz nawiasów klasy
Product
, za w'a$ciwo$ci!
imageName
, zdefiniuj funkcj# konstruktora
klasy i okre$l parametry, które b#d! przekazywane do tej funkcji. Musz! si# one zgadza&
typem danych z typem ju zdefiniowanych w'a$ciwo$ci. Nazwy powinny by& jednakowe, nale y
je jednak poprzedzi& podkre$lnikiem, aby unikn!& kolizji nazw parametrów i w'a$ciwo$ci
(wyst#puj!cej, gdy taka sama nazwa odnosi si# do dwóch ró nych zmiennych). Upewnij si#,
e nazwa funkcji odpowiada nazwie klasy oraz e konstruktor jest publiczny. Nie mo na
nada& typu funkcji konstruktora.
public function Product(_catID:Number, _prodName:String, _unitID:Number,
_cost:Number, _listPrice:Number, _description:String, _isOrganic:Boolean,
_isLowFat:Boolean, _imageName:String){
}
Funkcja konstruktora jest wywo'ywana za ka dym razem, gdy z klasy jest tworzony obiekt.
Mo na utworzy& z klasy obiekt, u ywaj!c s'owa kluczowego
new
i przekazuj!c klasie parametry.
Na koniec przeka emy warto$ci ze znacznika
<mx:Model>
lub bazy danych do parametru
konstruktora.
5.
Wewn!trz funkcji konstruktora nadaj ka dej w'a$ciwo$ci warto$& przes'an! do funkcji
konstruktora.
public function Product(_catID:Number, _prodName:String, _unitID:Number,
_cost:Number, _listPrice:Number, _description:String, _isOrganic:Boolean,
_isLowFat:Boolean, _imageName:String)
{
catID =_catID;
prodName = _prodName;
unitID = _unitID;
cost = _cost;
listPrice = _listPrice;
description = _description;
isOrganic = _isOrganic;
isLowFat = _isLowFat;
imageName = _imageName;
}
Powy szy kod ustawi warto$& ka dej w'a$ciwo$ci klasy na równ! odpowiedniemu parametrowi
przes'anemu do konstruktora.
122
ADOBE FLEX 3.
Oficjalny podr.cznik
Ka%da w$a0ciwo0+ wymieniona po lewej stronie znaku równo0ci mo%e mie+ przedrostek
this., na przyk$ad this.catID = _catID;. Taki przedrostek jest czasem dodawany przez
programistów, którzy chc" u%ywa+ takich samych nazw w$a0ciwo0ci oraz parametrów
i mimo to unika+ kolizji nazw. Przedrostek this odwo$uje si# do samej klasy.
6.
Utwórz bezpo$rednio pod funkcj! konstruktora now! metod# o nazwie
toString()
,
zwracaj!c! 'a/cuch
[Product]
i nazw# produktu.
public function toString():String
{
return "[Product]"+this.prodName;
}
Metoda ta b#dzie zwraca'a nazw# aktualnego produktu i b#dzie przydatna przy pobieraniu
nazwy. Tworzenie metod daj!cych dost#p do w'a$ciwo$ci jest dobrym zwyczajem, poniewa
je eli nazwa w'a$ciwo$ci si# zmieni, wci! b#dzie mo na wywo'a& t# sam! funkcj#, wykorzystuj!c
kod dziedziczony. Metoda
toString()
jest wywo'ywana automatycznie przez szkielet Fleksa
za ka dym razem, gdy obiekt jest $ledzony. Jest to bardzo przydatne podczas debugowania
i wy$wietlania struktur danych.
7.
Wró& do pliku
EComm.mxml i znajd1 blok skryptu u góry strony. Poni ej znacznika
CDATA
zaimportuj klas#
Product
z katalogu
valueObjects.
import valueObjects.Product;
W celu u ycia klasy niestandardowej Flex Builder musi skorzysta& z wyra enia
import
odwo'uj!cego si# do po'o enia lub pakietu, w którym klasa jest umieszczona. Kiedy tworzona
jest w'asna klasa, nale y j! zaimportowa&, aby by'a dost#pna dla szkieletu Fleksa. Wykonuje
si# to za pomoc! s'owa kluczowego
import
.
8.
W bloku skryptu nast#puj!cym po wyra eniu
import
, powy ej funkcji, zadeklaruj zmienn!
prywatn! typu
Product
o nazwie
theProduct
. Dodaj znacznik metadanych
[Bindable]
.
[Bindable]
private var theProduct:Product;
Wszystkie pliki MXML s! ostatecznie kompilowane do klasy j#zyka ActionScript. Nale y
podczas tworzenia pliku MXML stosowa& t# sam! konwencj#, co podczas tworzenia klasy
j#zyka ActionScript. Nale y na przyk'ad zaimportowa& wszystkie klasy, które nie s!
macierzystymi dla j#zyka ActionScript, tak jak utworzona klasa
Product
, i zadeklarowa&
wszystkie w'a$ciwo$ci, które zostan! u yte w pliku MXML. Zostaje to wykonane w bloku
skryptu. Znacznik metadanych
[Bindable]
gwarantuje, e warto$& tej w'a$ciwo$ci mo e
zosta& u yta w wyra eniach powi!za/.
9.
Wewn!trz funkcji
prodHandler()
, ale powy ej wyra e/
trace
, utwórz nowy egzemplarz klasy
Product
o nazwie
theProduct
. Wype'nij i prze$lij parametr do funkcji konstruktora z informacj!
ze znacznika
<mx:Model>
:
theProduct = new Product(theItems.catID, theItems.prodName, theItems.unitID,
theItems.cost, theItems.listPrice, theItems.description, theItems.isOrganic,
theItems.isLowfat, theItems.imageName);
U ywasz nowo utworzonej klasy i tworzysz egzemplarz jej obiektu. Dane ze znacznika
<mx:Model>
zostaj! przekazane jako warto$ci dla w'a$ciwo$ci.
LEKCJA 5.
123
Obs#uga zdarze( i struktury danych
10.
Usu/ z funkcji
prodHandler()
dwa wyra enia
trace
i zamie/ je na nowe wyra enia
trace
.
B#d! one pobiera'y automatycznie informacje okre$lone w metodzie
toString()
.
trace(theProduct);
11.
Zapisz i w'!cz debugowanie aplikacji.
W widoku konsoli powinien zosta& wy$wietlony tekst
[Product]Milk
wskazuj!cy, e utworzy'e$
obiekt warto$ci
Product
.
Tworzenie metody kreujAcej obiekt
Tak jak zrobili$my to w poprzednim &wiczeniu, mo na utworzy& egzemplarz klasy
Product
, prze-
kazuj!c wszystkie warto$ci do metody konstruktora jako parametry. W tym zadaniu utworzymy
metod#, która przyjmuje obiekt zawieraj!cy wszystkie pary w'a$ciwo$& – warto$& i zwraca egzemplarz
klasy
Product
. Trzeba zauwa y&, e dla poprawnego dzia'ania tej metody obiekt przekazywany do
niej musi zawiera& nazwy w'a$ciwo$ci dok'adnie odpowiadaj!ce tym u ytym w klasie.
1.
Upewnij si#, e klasa
Product
w katalogu
valueObjects jest otwarta. Znajd1 metod#
toString()
i dodaj za ni! szkielet nowej metody o w'a$ciwo$ciach
public
i
static
, nazwanej
buildProduct()
. Upewnij si#, e zwracane przez ni! dane s! typu
Product
oraz e przyjmuje
ona parametr
o
o typie danych
Object
, tak jak poni ej:
public static function buildProduct(o:Object):Product
{
}
Metoda statyczna mo e by& wywo'ywana bez potrzeby wcze$niejszego tworzenia obiektu
z klasy. Metody egzemplarzowe, tak jak te, których u ywali$my dot!d, mog! by& stosowane
tylko z obiektami, których egzemplarze s! tworzone z klasy. Metody zadeklarowane jako
statyczne mog! by& u ywane bezpo$rednio z klasy. Metody statyczne s! przydatne w programach
u ytkowych, na przyk'ad tworzona tutaj statyczna metoda
buildObject()
, do której chcemy
mie& dost#p bez potrzeby tworzenia wcze$niej obiektu. Odpowiednio u yte metody statyczne
mog! podnie$& wydajno$&, poniewa nie musz! tworzy& najpierw obiektu zajmuj!cego pami#&
komputera. W celu odwo'ania si# do statycznej metody
getName()
z klasy
Product
powinni$my
zastosowa& kod
Product.getName()
, który korzysta z nazwy klasy wstawionej przed metod!,
a nie z nazwy obiektu, którego egzemplarz utworzono z klasy.
2.
Wewn!trz metody
buildProduct()
utwórz egzemplarz klasy
Product
o nazwie
p
, u ywaj!c
s'owa kluczowego
new
. Ustaw w'a$ciwo$ci
catID
,
prodName
,
unitID
,
cost
,
listPrice
,
description
,
isOrganic
,
isLowFat
i
imageName
jako parametry konstruktora. B#dziesz
musia' rzutowa& zmienne
isOrganic
i
isLowFat
do typu boolowskiego.
124
ADOBE FLEX 3.
Oficjalny podr.cznik
var p:Product = new Product(o.catID, o.prodName, o.unitID, o.cost, o.listPrice,
o.description, Boolean(o.isOrganic), Boolean(o.isLowFat), o.imageName);
Pami#taj, e u yte tutaj dane s! pobierane ze znacznika
<mx:Model>
. Kiedy s! pobierane w ten
sposób, nie posiadaj! typu, wi#c warto$ci
true
i
false
s! traktowane jak zwyk'e 'a/cuchy
znakowe. Rzutowanie zmiennej dostarcza kompilatorowi informacji, e ma traktowa&
warto$& jako dan! okre$lonego typu. W tym przyk'adzie informujesz kompilator, e Ty jako
programista wiesz, e w'a$ciwo$ci
isOrganic
i
isLowFat
b#d! zawiera'y dane logiczne i przez
ich rzutowanie do tego typu nowo utworzony obiekt b#dzie posiada' warto$ci logiczne dla
w'a$ciwo$ci
isOrganic
i
isLowFat
.
3.
Wró& do w'a$nie utworzonego obiektu, u ywaj!c s'owa kluczowego
return
z nazw! obiektu,
czyli
p
. Gotowa metoda
buildProduct()
powinna mie& posta&:
public static function buildProduct(o:Object):Product{
var p:Product = new Product(o.catID, o.prodName, o.unitID, o.cost,
o.listPrice, o.description, Boolean(o.isOrganic), Boolean(o.isLowFat),
o.imageName);
return p;
}
Powy szy kod zwróci obiekt warto$ci
Product
utworzony przez przekazanie ogólnego
obiektu do metody.
4.
Zapisz plik
Product.as.
Plik klasy zosta' zapisany z now! metod!. W widoku
Problems nie powinny pojawi& si# adne
komunikaty o b'#dach.
5.
Wró& do aplikacji
EComm.mxml. Z metody
prodHandler()
usu/ kod tworz!cy
theProduct
i wstaw zamiast niego kod u ywaj!cy metody statycznej do utworzenia
theProduct
.
Pami#taj o usuni#ciu s'owa kluczowego
new
.
theProduct = Product.buildProduct(theItems);
Powy szy kod wywo'uje statyczn! metod# tworz!c! egzemplarz klasy
Product
, która zwraca
obiekt warto$ci
Product
o nadanym mocnym typie z obiektu, który nie posiada' nadanego typu.
6.
Znajd1 w stanie rozszerzonym pierwszy kontener uk'adu
VBox
, który wy$wietla opis produktu
oraz informacje, czy jest on ekologiczny i dietetyczny. Zmie/ w'a$ciwo$&
text
znacznika
<mx:Text>
tak, by odwo'ywa' si# do obiektu
theProduct
utworzonego metod!
prodHandler()
.
Dodaj tak e w'a$ciwo$&
visible
do obu etykiet oraz powi! ka d! z nich z odpowiedni!
w'a$ciwo$ci! obiektu
theProduct
, tak jak jest to pokazane w nast#pnym fragmencie kodu.
(Zobacz rysunek na nast#pnej stronie).
Pami#taj, %e teraz Product jest klas" zaimportowan", dost#pne jest zatem podpowiadanie
kodu zarówno dla nazwy klasy, jak i jej w$a0ciwo0ci. Kiedy kursor znajduje si# wewn"trz
nawiasów tworz"cych powi"zanie, naci0nij Ctrl+spacja, aby uzyska+ pomoc we wpisywaniu
egzemplarza klasy Product — theProduct. Nast#pnie, po wstawieniu kropki, zostan"
wy0wietlone w$a0ciwo0ci.
LEKCJA 5.
125
Obs#uga zdarze( i struktury danych
<mx:VBox x="200" width="100%">
<mx:Text text="{theProduct.description}"
width="50%"/>
<mx:Label
text="Certified Organic"
visible="{theProduct.isOrganic}"/>
<mx:Label
text="LowFat"
visible="{theProduct.isLowFat}"/>
</mx:VBox>
Odwo'ujesz si# teraz do obiektu warto$ci, który utworzyli$my wcze$niej.
7.
Zapisz plik i uruchom debugowanie.
Powinno by& widoczne, e
trace
dzia'a tak jak wcze$niej, a powi!zanie danych powinno
dzia'a& po umieszczeniu kursora na obrazku.
Tworzenie klas koszyka na zakupy
W tym &wiczeniu utworzymy now! klas# dla produktów dodawanych do koszyka na zakupy. Jej
zadaniem b#dzie $ledzenie, jaki produkt zosta' dodany oraz w jakiej ilo$ci. Utworzymy metod#, która
b#dzie liczy'a koszt zakupu tego produktu. Zbudujemy tak e szkielet klasy
ShoppingCart
, która b#dzie
obs'ugiwa'a ca'y uk'ad logiczny koszyka na zakupy, wliczaj!c w to dodawanie do niego elementów.
1.
Utwórz nowy plik klasy j#zyka ActionScript, wybieraj!c z menu
File/New/ActionScript class.
Ustaw warto$&
Package równ!
valueObjects
, dodaj!c automatycznie t# klas# do utworzonego
wcze$niej katalogu. Wprowad1
ShoppingCartItem
w polu nazwy i pozostaw warto$ci domy$lne
dla wszystkich pozosta'ych pól.
W tej klasie b#dzie sprawdzana liczba produktów oraz ich cena.
2.
Wewn!trz definicji
class
wstaw w'a$ciwo$& publiczn! o nazwie
product
i typie danych
Product
:
package valueObjects {
public class ShoppingCartItem {
public var product:Product;
}
}
126
ADOBE FLEX 3.
Oficjalny podr.cznik
Wa nym elementem koszyka na zakupy jest informacja, który produkt zosta' do niego dodany.
Utworzyli$my ju klas#
Product
s'u !c! $ledzeniu tych danych, jest wi#c jak najbardziej logiczne
wykorzystanie egzemplarza tej klasy w klasie
ShoppingCartItem
.
3.
Zdefiniuj w'a$ciwo$& publiczn! o nazwie
quantity
i typie danych
uint
:
package valueObjects {
public class ShoppingCartItem {
public var product:Product;
public var quantity:uint;
}
}
Typ danych
uint
oznacza ca'kowit! liczb# nieujemn! (0, 1, 2, 3, …). Ilo$& dodanego do koszyka
produktu mo e wynosi& zero lub zosta& okre$lona liczb! dodatni!, zastosowanie typu
uint
jest wi#c logiczne.
4.
Zdefiniuj w'a$ciwo$& publiczn! typu
Number
o nazwie
subtotal
:
package valueObjects {
public class ShoppingCartItem {
public var product:Product;
public var quantity:uint;
public var subtotal:Number;
}
}
Za ka dym razem, gdy u ytkownik doda produkt do koszyka, b#dzie potrzebna aktualizacja
sumy warto$ci produktów. Ostatecznie dane te zostan! wy$wietlone w kontrolce.
5.
Zaraz po w'a$ciwo$ci
subtotal
zdefiniuj nag'ówek funkcji konstruktora klasy i okre$l parametry
przekazywane do tej funkcji. Zaliczaj! si# do nich:
product
, parametry typu
Product
i
quantity
oraz parametry typu
uint
. Poniewa konstruktor jest wywo'ywany tylko podczas tworzenia
produktu, ustaw warto$& parametru
quantity
równ!
1
.
public function ShoppingCartItem(product:Product, quantity:uint=1)
{
}
Pami#taj, e funkcje konstruktora musz! by& funkcjami publicznymi i nie mog! posiada& typu.
6.
W funkcji konstruktora przypisz w'a$ciwo$ciom klasy warto$ci parametryczne. W tym
przypadku zosta'y u yte jednakowe nazwy, nale y wi#c poprzedzi& nazwy w'a$ciwo$ci
po lewej stronie znaków równo$ci przedrostkiem
this
. Przypisz równie w'a$ciwo$ci
subtotal
warto$& wyra enia w'a$ciwo$ci
listPrice
produktu pomno onego razy
quantity
.
public function ShoppingCartItem(product:Product, quantity:uint=1){
this.product = product;
this.quantity = quantity;
this.subtotal = product.listPrice * quantity;
}
Pami#taj, e funkcja konstruktora jest wywo'ywana automatycznie za ka dym razem, gdy jest
tworzony obiekt z klasy. Konstruktor ustawi w'a$ciwo$ci, które zosta'y do niego przekazane
— w tym przypadku b#dzie to egzemplarz klasy
Product
oraz ilo$&, która otrzymuje domy$ln!
warto$& równ!
1
. Metoda ta zostanie u yta tylko podczas dodawania produktu do koszyka,
logiczne jest wi#c zdefiniowanie ilo$ci pocz!tkowej równej
1
.
LEKCJA 5.
127
Obs#uga zdarze( i struktury danych
7.
Utwórz metod# publiczn! o nazwie
recalc()
, która b#dzie przelicza'a sum# ka dego produktu
(mno y'a warto$&
listPrice
produktu razy
quantity
):
public function recalc():void{
this.subtotal = product.listPrice * quantity;
}
Kiedy u ytkownik dodaje produkt do koszyka, nale y przeprowadzi& kalkulacj# w celu
zaktualizowania ca'kowitej sumy. Nale y tak e sprawdzi&, czy element zosta' ju wcze$niej
dodany do koszyka — je eli tak, nale y zaktualizowa& ilo$&. W nast#pnej lekcji wyja$nimy,
jak to wykona&.
8.
Utworzymy teraz now! klas#. Wybierz z menu
File/New/ActionScript class. Ustaw warto$& Package
równ!
valueObjects
, dodaj!c automatycznie t# klas# do utworzonego wcze$niej katalogu.
Wprowad1
ShoppingCart
w polu nazwy i pozostaw warto$ci domy$lne dla wszystkich
pozosta'ych pól.
Tworzymy now! klas#, która b#dzie samym koszykiem wype'nionym obiektami
shoppingCartItem
. Jej zadaniem b#dzie obróbka danych dla koszyka z zakupami.
Zaprojektowali$my ju wygl!d i styl graficzny koszyka, mo emy wi#c wprowadzi& ekonomiczny
uk'ad logiczny do klasy
ShoppingCart
. W sk'ad uk'adu logicznego wchodz!: dodawanie
produktów do koszyka, usuwanie ich z koszyka, aktualizacja produktów w koszyku itp.
9.
Dodaj wyra enie
import
, które pozwoli u ywa& narz#dzi Fleksa, takich jak wyra enie
trace
,
wewn!trz klasy:
package valueObjects{
import flash.utils.*
public class ShoppingCart{
}
}
Z tego samego powodu, z jakiego nale y zaimportowa& klasy niestandardowe, aby mog'y
zosta& wykorzystane, konieczne jest te zaimportowanie odpowiednich klas szkieletu. B#dziemy
u ywali funkcji
trace()
i innych narz#dzi, co wymaga zaimportowania tych klas.
10.
Utwórz szkielet publicznej metody
addItem()
typu
void
przyjmuj!cej parametr o nazwie
item
typu
ShoppingCartItem
. Wewn!trz metody dodaj wyra enie
trace
, które b#dzie $ledzi'o
produkt dodany do koszyka:
package valueObjects{
import flash.utils.*
public class ShoppingCart{
public function addItem(item:ShoppingCartItem):void{
trace(item.product);
}
}
}
W metodzie tej b#dziemy dodawali nowe elementy do koszyka. W pó1niejszych lekcjach dodamy
do niej logik#. W tej chwili metoda b#dzie tylko $ledzi'a produkty dodawane do koszyka.
Pami#taj, e napisana wcze$niej funkcja
toString()
jest wywo'ywana automatycznie, zawsze
gdy jest $ledzony egzemplarz klasy
Product
.
128
ADOBE FLEX 3.
Oficjalny podr.cznik
11.
Otwórz w programie Flex Builder plik
EComm.mxml i znajd1 blok skryptu. Pod wyra eniem
import
klasy
Product
zaimportuj klasy
ShoppingCartItem
i
ShoppingCart
z katalogu
valueObjects, tak jak poni ej:
import valueObjects.ShoppingCartItem;
import.valueObjects.ShoppingCart;
Aby u y& klasy, Flex Builder potrzebuje wyra enia
import
odwo'uj!cego si# do adresu
lub pakietu, w którym mie$ci si# klasa.
12.
Pod wyra eniami
import
utwórz egzemplarz publiczny klasy
ShoppingCart
i nadaj
mu nazw#
cart
, a nast#pnie dodaj znacznik metadanych
[Bindable]
:
[Bindable]
public var cart:ShoppingCart = new ShoppingCart();
Kiedy u ytkownik klika przycisk
Add To Cart, nale y wywo'a& metod# klasy
ShoppingCartItem
o nazwie
addItem()
, któr! w'a$nie utworzyli$my. Dzi#ki utworzeniu egzemplarza klasy
w tym miejscu mamy pewno$&, e b#dzie ona dost#pna w ca'ej aplikacji.
13.
Znajd1 w bloku
<mx:Script>
metod#
prodHandler()
. Zaraz za ni! dodaj szkielet nowej prywatnej
metody typu
void
o nazwie
addToCart()
. Spraw, by przyjmowa'a parametr typu
Product
o nazwie
product
, tak jak poni ej:
private function addToCart(product:Product):void {
}
Powy sza metoda b#dzie wywo'ywana, gdy u ytkownik kliknie przycisk
Add i zostanie
przes'any wybrany przez niego obiekt warto$ci
Product
. Jest to metoda pliku MXML i nie
b#dzie wywo'ywana spoza tego pliku. W ten sposób mo na u ywa& prywatnego identyfikatora
oznaczaj!cego, e do danej metody nie mo na uzyska& dost#pu spoza jej klasy, co sprzyja
lepszej ochronie danych.
14.
Wewn!trz metody
addToCart()
utwórz nowy egzemplarz klasy
ShoppingCartItem
o nazwie
sci
i przeka do jego konstruktora parametr
product
:
var sci:ShoppingCartItem = new ShoppingCartItem(product);
15.
Wewn!trz metody
addToCart()
wywo'aj metod#
addItem()
egzemplarza
cart
klasy
ShoppingCart
. Prze$lij do metody utworzony obiekt
sci
:
cart.addItem(sci);
Kod ten wywo'a metod#
addItem()
utworzonej wcze$niej klasy
ShoppingCart
. W kolejnej
lekcji poka emy, jak wykonywa& p#tle przez struktur# danych w celu sprawdzenia, czy element
zosta' do niej dodany. Obecnie metoda ta po prostu $ledzi nazw# produktu dodanego
do koszyka.
16.
Dodaj zdarzenie
click
do przycisku
Add To Cart. Wywo'aj metod#
addToCart()
, przekazuj!c
do niej egzemplarz
theProduct
:
<mx:Button id="add" label="Add To Cart"
<click="addToCart(theProduct)"/>
LEKCJA 5.
129
Obs#uga zdarze( i struktury danych
17.
Zapisz aplikacj# i uruchom debugowanie.
Po ka dym klikni#ciu przycisku
Add To Cart powiniene$ widzie& tekst
[Product]Milk
pojawiaj!cy si# w widoku
Console.
Czego si. nauczy#e@?
Podczas tej lekcji:
zrozumia'e$, na czym polega obs'uga zdarze/ (s. 108 – 110),
obs'ugiwa'e$ zdarzenie
creationComplete
znacznika
<mx:Application>
w celu utworzenia
struktury danych (s. 111 – 114),
zbada'e$ obiekt zdarzenia, aby zrozumie&, czym jest, i korzysta'e$ z dwóch w'a$ciwo$ci tego
obiektu (s. 114 – 117),
zrozumia'e$ podstawow! struktur# klasy j#zyka ActionScript (s. 118),
tworzy'e$ klasy j#zyka ActionScript b#d!ce obiektami warto$ci (s. 118 – 123),
tworzy'e$ w'a$ciwo$ci, metody i metody statyczne klas j#zyka ActionScript (s. 123 – 129).