Tytuł oryginału: Learning Web Development with Bootstrap and AngularJS
Tłumaczenie: Piotr Cieślak
ISBN: 978-83-283-1847-2
Copyright © Packt Publishing 2015. First published in the English language under the title ‘Learning Web
Development with Bootstrap and AngularJS – (9781783287550)’.
Polish edition copyright © 2016 by Helion S.A.
All rights reserved.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich
właścicieli.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były
kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane
z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION
nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji
zawartych w książce.
Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail:
helion@helion.pl
WWW:
http://helion.pl (księgarnia internetowa, katalog książek)
Pliki z przykładami omawianymi w książce można znaleźć pod adresem:
ftp://ftp.helion.pl/przyklady/pnasab.zip
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/pnasab
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Printed in Poland.
Spis treĂci
O autorze
10
O recenzentach
11
Przedmowa
13
Rozdziaï 1. Witaj, {{imiÚ}}
17
Przygotowania
17
Instalowanie i zastosowanie AngularJS oraz Bootstrapa
18
Instalowanie Bootstrapa
18
Instalowanie AngularJS
19
Zastosowanie AngularJS
20
Bootstrap
23
Pytania sprawdzajÈce
27
Podsumowanie
27
Rozdziaï 2. Projektowanie za pomocÈ AngularJS i Bootstrapa
29
Przygotowania
29
Struktura
30
Nawigacja
30
Zastosowanie dyrektyw
36
Dyrektywy ng-click i ng-mouseover
37
Dyrektywa ng-init
39
Dyrektywy ng-show i ng-hide
39
Dyrektywa ng-if
40
Dyrektywa ng-repeat
40
Dyrektywa ng-class
42
Dyrektywa ng-style
42
Dyrektywa ng-cloak
43
Pytania sprawdzajÈce
44
Podsumowanie
44
Spis
treĞci
4
Rozdziaï 3. Filtry
47
Stosowanie filtra w widoku
47
Waluta i liczby
48
Maïe i wielkie litery
49
Filtr limitTo
49
Data
49
Filtr Filter
51
Sortowanie za pomocÈ orderBy
52
JSON
52
Stosowanie filtrów z poziomu JavaScriptu
53
Tworzenie wïasnego filtra
55
Moduïy
55
Tworzenie filtra
56
Pytania sprawdzajÈce
58
Podsumowanie
58
Rozdziaï 4. Routing
59
Instalowanie ngRoute
59
Tworzenie tras podstawowych
60
Trasy z parametrami
63
Trasa domyĂlna
64
Routing w HTML5 albo usuwanie #
64
WïÈczanie HTML5Mode
64
Odsyïacze do tras
65
Pytania sprawdzajÈce
65
Podsumowanie
66
Rozdziaï 5. Budowanie widoków
67
Konstruowanie widoku Indeks
67
Konstruowanie widoku Dodaj kontakt
70
Formularze poziome
72
Konstruowanie widoku WyĂwietl kontakt
73
Tytuï i Gravatar
74
Klasa form-horizontal
75
Pytania sprawdzajÈce
77
Podsumowanie
77
Rozdziaï 6. CRUD
79
R jak Read
79
Wspóïdzielenie danych miÚdzy widokami
80
Tworzenie niestandardowej dyrektywy
86
UwzglÚdnianie zakoñczeñ linii
91
Wyszukiwanie oraz definiowanie klasy dla aktywnej strony aplikacji
92
C jak Create
94
Spis treĞci
5
U jak Update
95
WïaĂciwoĂÊ scope
96
Kontroler
96
Èczenie elementów
97
D jak Delete
100
Pytania sprawdzajÈce
101
Podsumowanie
101
Rozdziaï 7. AngularStrap
103
Instalowanie AngularStrapa
103
Zastosowanie AngularStrapa
104
Okno modalne
105
Okienko podpowiedzi
105
Okienka wyskakujÈce
107
Ostrzeĝenia
108
Zastosowanie usïug AngularStrapa
109
Integrowanie AngularStrapa
110
Pytania sprawdzajÈce
113
Podsumowanie
113
Rozdziaï 8. Komunikacja z serwerem
115
Èczenie za poĂrednictwem usïugi $http
116
Przesyïanie danych
118
Èczenie za pomocÈ moduïu ngResource
118
Podpinanie ngResource
119
Konfigurowanie ngResource
119
Pozyskiwanie informacji z serwera
120
Wysyïanie danych na serwer
121
Usuwanie kontaktów
123
Obsïuga bïÚdów
124
Inne metody ïÈczenia z serwerem
124
RestAngular
124
Firebase
125
Pytania sprawdzajÈce
127
Podsumowanie
127
Rozdziaï 9. Automatyzacja zadañ
129
Instalowanie Node i NPM
129
Zastosowanie Grunta
131
Instalowanie wiersza poleceñ
131
Instalowanie Grunta
131
Zastosowanie gulpa
137
Globalna instalacja gulpa
137
Instalowanie zaleĝnoĂci gulpa
137
Konfigurowanie pliku gulpfile
138
Spis
treĞci
6
Restrukturyzacja projektu
141
Pytania sprawdzajÈce
143
Podsumowanie
143
Rozdziaï 10. Dostosowywanie Bootstrapa
145
Kompilowanie plików Less za pomocÈ Grunta albo gulpa
145
Pobieranie ěródeï
146
Kompilowanie z uĝyciem Grunta
146
Kompilowanie z uĝyciem gulpa
149
ABC preprocesora Less
152
Importowanie
152
Zmienne
152
Zagnieĝdĝone reguïy
153
Domieszki
154
Konfigurowanie stylów Bootstrapa
154
Typografia
154
Pasek nawigacji
155
Formularze
156
Przyciski
157
Motywy Bootstrapa
158
Gdzie szukaÊ dodatkowych motywów Bootstrapa?
158
Pytania sprawdzajÈce
158
Podsumowanie
159
Rozdziaï 11. Walidacja
161
Weryfikacja formularzy
161
ZgodnoĂÊ ze wzorcem
166
Zastosowanie dyrektyw minlength, maxlength, min i max
167
Tworzenie niestandardowego walidatora
167
Pytania sprawdzajÈce
169
Podsumowanie
170
Rozdziaï 12. NarzÚdzia opracowane przez spoïecznoĂÊ
171
Batarang
171
Instalowanie Bataranga
172
Inspekcja obiektu scope i wïaĂciwoĂci
173
Analiza wydajnoĂci
174
Wizualizacja zaleĝnoĂci
175
Opcje Bataranga
176
Projekt ng-annotate
177
Instalacja ng-annotate
177
WïÈczanie ng-annotate do Grunta
178
Uĝywanie ng-annotate w poïÈczeniu z gulpem
185
Pytania sprawdzajÈce
187
Podsumowanie
187
Spis treĞci
7
Dodatek A. Ciekawi ludzie i projekty
189
Projekty zwiÈzane z Bootstrapem i ich autorzy
189
Zespóï odpowiedzialny za podstawowy projekt
189
Bootstrap Expo
190
BootSnipp
190
Przewodnik kodowania autorstwa @mdo
190
Roots
191
Shoelace
191
Snippety Bootstrapa 3 dla edytora Sublime Text
191
Font Awesome
192
Bootstrap Icons
192
Projekty zwiÈzane z AngularJS i ich autorzy
192
Zespóï odpowiedzialny za podstawowy projekt
192
RestAngular
193
AngularStrap i AngularMotion
193
AngularUI
193
Mobile AngularUI
194
Ionic
194
AngularGM
195
A teraz Twoja kolej…
195
Dodatek B. Gdzie szukaÊ pomocy?
197
Oficjalna dokumentacja
197
GitHub
197
Stack Overflow
198
Grupa AngularJS w Google
198
Egghead.io
198
198
Dodatek C. Odpowiedzi na pytania sprawdzajÈce
201
Skorowidz
205
2
Projektowanie
za pomocÈ AngularJS
i Bootstrapa
Teraz, gdy masz juĝ za sobÈ opracowanie pierwszej aplikacji z uĝyciem AngularJS i Bootstra-
pa, pora podnieĂÊ poprzeczkÚ. W dalszej czÚĂci ksiÈĝki bÚdziemy uĝywaÊ obu frameworków
do zbudowania aplikacji typu „menedĝer kontaktów”, wyposaĝonej w wyszukiwarkÚ tekstowÈ
oraz funkcje umoĝliwiajÈce tworzenie, edytowanie i usuwanie rekordów. Zastanowimy siÚ, jak
utworzyÊ ïatwy w utrzymaniu kod, a zarazem przyjrzymy siÚ potencjaïowi obydwu platform.
A zatem do dzieïa!
Przygotowania
Przygotujmy nowy katalog dla naszej aplikacji i nadajmy mu strukturÚ podobnÈ jak dla pro-
gramu „Witaj, Ăwiecie”, opisanego w rozdziale 1. „Witaj, {{imiÚ}}.
Struktura taka jak poniĝsza bÚdzie w sam raz (patrz rysunek na nastÚpnej stronie).
Zauwaĝ, ĝe umieĂciïem znane Ci juĝ foldery w nadrzÚdnym katalogu assets, aby uniknÈÊ ba-
ïaganu. Skopiuj pliki Angulara i Bootstrapa z folderu rozdziaïu 1. „Witaj, {{imiÚ}}” do odpo-
wiednich folderów w nowym katalogu, natomiast w katalogu gïównym utwórz plik index.html,
który bÚdzie podstawÈ naszej aplikacji do zarzÈdzania kontaktami. Poniĝszy fragment kodu to
bazowy dokument HTML zawierajÈcy odwoïania do Bootstrapa i Angulara. Jak widaÊ, zaini-
cjalizowaïem juĝ Angulara przy uĝyciu atrybutu
ng-app
, umieszczonego w znaczniku
<html>
.
Na tym etapie zawartoĂÊ strony powinna byÊ taka:
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
30
<!DOCTYPE html>
<html lang="pl" ng-app>
<head>
<meta charset="utf-8">
<title>Menedĝer kontaktów</title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css">
<script type="text/javascript" src="assets/js/angular.min.js"></script>
</head>
<body>
</body>
</html>
Struktura
Dysponujemy podstawowÈ strukturÈ folderów oraz plikiem bazowym, moĝemy wiÚc zaczÈÊ
budowaÊ makietÚ aplikacji za pomocÈ Bootstrapa. Oprócz zbioru komponentów, takich jak
elementy nawigacji i przyciski, których uĝyjemy do zbudowania struktury menedĝera kon-
taktów, Bootstrap jest teĝ wyposaĝony w elastyczny, responsywny system siatkowy, którego
moĝliwoĂci takĝe wykorzystamy w naszej aplikacji.
Nawigacja
Do przeïÈczania miÚdzy widokami uĝyjemy komponentu
navbar
. BÚdzie on, rzecz jasna,
znajdowaï siÚ w górnej czÚĂci ekranu.
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
31
Zanim rozïoĝymy nawigacjÚ na skïadowe, przyjrzyjmy siÚ, jak bÚdzie wyglÈdaïa w caïoĂci:
<nav class="navbar navbar-default"role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse"
data-target="#nav-toggle">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Menedĝer kontaktów</a>
</div>
<div class="collapse navbar-collapse" id="nav-toggle">
<ul class="nav navbar-nav">
<li class="active"><a href="/">PrzeglÈdaj</a></li>
<li><a href="/add">Dodaj kontakt</a></li>
</ul>
<form class="navbar-form navbar-right" role="search">
<input type="text" class="form-control" placeholder="Szukaj">
</form>
</div>
</nav>
Jak na coĂ, co ma byÊ bardzo prostym komponentem naszej strony, ten kod wyglÈda na doĂÊ
skomplikowany. Ale jeĂli przeanalizujemy go krok po kroku, okaĝe siÚ, ĝe zawiera tylko naj-
potrzebniejsze skïadniki.
Znacznik
<nav>
obejmuje wszystkie elementy naszego paska nawigacji. WewnÈtrz niego na-
wigacja jest podzielona na dwie sekcje:
navbar-header
i
navbar-collapse
. Te elementy odno-
szÈ siÚ tylko do wersji mobilnej i decydujÈ o tym, co jest widoczne, a co ukryte po uĝyciu
przeïÈcznika nawigacji.
Atrybut
data-target
dla przycisku odpowiada atrybutowi
id
elementu
navbar-collapse
, dziÚ-
ki czemu Bootstrap „wie”, czym powinien sterowaÊ ten przycisk. Poniĝszy zrzut ekranu pre-
zentuje wyglÈd elementów nawigacji na urzÈdzeniach wiÚkszych od tabletu.
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
32
NawigacjÚ umieĂcimy w znaczniku
<body>
, dziÚki czemu jej elementy bÚdÈ rozciÈgaïy siÚ na
caïÈ szerokoĂÊ okna przeglÈdarki.
JeĂli zwÚzisz okno przeglÈdarki do szerokoĂci poniĝej 768 pikseli (szerokoĂÊ ekranu iPada
w uïoĝeniu pionowym), Bootstrap przeïÈczy nawigacjÚ na wariant dostosowany do urzÈdzeñ
mobilnych, z przeïÈcznikiem w formie przycisku. Ale jeĂli klikniesz ów przycisk, nic siÚ nie
stanie. To dlatego, ĝe na razie nie doïÈczyliĂmy jeszcze biblioteki ze skryptami JavaScript dla
Bootstrapa, znajdujÈcej siÚ w pobranym wczeĂniej archiwum.
Skopiuj plik z tÈ bibliotekÈ do katalogu js i doïÈcz jÈ do dokumentu w pliku index.html. Oprócz
tego do aplikacji trzeba doïÈczyÊ bibliotekÚ jQuery, poniewaĝ wymagajÈ jej skrypty JS dla Boot-
strapa. NajnowszÈ wersjÚ jQuery moĝesz pobraÊ ze strony http://jquery.com. Tak jak poprzednie
pliki, naleĝy umieĂciÊ jÈ w katalogu js i doïÈczyÊ w kodzie przed plikiem bootstrap.js. Upew-
nij siÚ, ĝe kolejnoĂÊ doïÈczania plików JavaScript w kodzie jest nastÚpujÈca:
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
<script src="assets/js/angular.min.js"></script>
JeĂli odĂwieĝysz stronÚ w przeglÈdarce, przycisk powinien teraz uaktywniaÊ nawigacjÚ w wersji
mobilnej.
Kilka sïów o systemie siatkowym Bootstrapa
Dwunastokolumnowy system siatkowy Bootstrapa jest niezwykle elastyczny i umoĝliwia utwo-
rzenie makiety aplikacji responsywnej przy uĝyciu zaledwie kilku elementów — z wykorzy-
staniem moduïowego charakteru CSS. Siatka Bootstrapa skïada siÚ z wierszy i kolumn, które
za pomocÈ dostÚpnych klas moĝna w róĝny sposób przystosowywaÊ do wïasnych potrzeb. Za-
nim zaczniemy siÚ niÈ posïugiwaÊ, powinniĂmy utworzyÊ dodatkowy kontener na wiersze
siatki, bo w przeciwnym razie caïa struktura nie bÚdzie reagowaÊ tak, jak powinna. FunkcjÚ
tego kontenera bÚdzie peïniï zwykïy znacznik
<div>
, który umieĂcimy pod paskiem nawigacji:
<div class="container"></div>
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
33
W rezultacie siatka zostanie wyĂrodkowana, a dodanie wïaĂciwoĂci
max-width
sprawi, ĝe ca-
ïoĂÊ bÚdzie wyglÈdaïa elegancko.
IstniejÈ cztery prefiksy nazw klas, decydujÈce o zachowaniu kolumn siatki. W wiÚkszoĂci wy-
padków bÚdziemy siÚ posïugiwaÊ prefiksem
col-sm-
. Prefiks ten sprawia, ĝe po zwÚĝeniu
kontenera do szerokoĂci poniĝej 750 pikseli kolumny sÈ ustawiane jedna nad drugÈ.
Pozostaïe klasy odnoszÈ siÚ do innych rozmiarów ekranu, ale ich zachowanie jest podobne.
Poniĝsza tabela (zaczerpniÚta z oficjalnej strony Bootstrapa: http://getbootstrap.com) ilustruje
róĝnice miÚdzy wszystkimi czterema klasami:
Telefony (< 768 px) Tablety ( 768 px) Komputery ( 992 px) Komputery ( 1200 px)
Zachowanie siatki
Pozioma
przez caïy czas
PoczÈtkowo zwiniÚta, pozioma po przekroczeniu okreĂlonej
szerokoĂci
Maksymalna
szerokoĂÊ kontenera
Brak (automatyczna) 750 px
970 px
1170 px
Prefiks klasy
.col-xs-
.col-sm-
.col-md-
.col-lg-
Maksymalna
szerokoĂÊ kolumny
Automatyczna
~62 px
~81 px
~97 px
PrzesuniÚcie (offset) Tak
KolejnoĂÊ kolumn
Tak
Utwórzmy zatem prosty ukïad dwukolumnowy z obszarem na gïównÈ treĂÊ i paskiem bocz-
nym. Poniewaĝ siatka skïada siÚ z 12 kolumn, musimy zadbaÊ o dopasowanie do niej obszaru
na treĂÊ, aby nie pozostawiÊ na ekranie pustego miejsca.
Moim zdaniem osiem kolumn na treĂÊ i cztery na pasek boczny to doskonaïe rozwiÈzanie, tyl-
ko jak zrealizowaÊ ten zamysï w praktyce?
Najpierw wewnÈtrz kontenera musimy utworzyÊ nowy znacznik
<div>
klasy
row
. BÚdzie to
wiersz siatki, których to wierszy moĝemy utworzyÊ dowolnÈ liczbÚ; kaĝdy z nich rozciÈga siÚ
na wszystkie 12 kolumn.
<div class="container">
<div class="row">
</div>
</div>
Poniewaĝ chcemy, aby na urzÈdzeniach mobilnych kolumny automatycznie zmieniaïy ukïad
na pionowy, uĝyjemy prefiksu
col-sm-
. Tworzenie kolumn jest bardzo proste: wystarczy wziÈÊ
ĝÈdany prefiks i dodaÊ do niego liczbÚ kolumn siatki Bootstrapa, jakÈ ma ona obejmowaÊ. Zo-
baczmy, jak bÚdzie wyglÈdaï nasz prosty ukïad dwukolumnowy:
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
34
<div class="container">
<div class="row">
<div class="col-sm-8">
To jest obszar na treĂÊ.
</div>
<div class="col-sm-4">
To jest pasek boczny.
</div>
</div>
</div>
Po wyĂwietleniu ukïadu na ekranie wiÚkszym niĝ ekran urzÈdzenia mobilnego Bootstrap automa-
tycznie doda 30 pikseli odstÚpu miÚdzy kolumnami (po 15 pikseli z kaĝdej strony). W niektó-
rych wypadkach bÚdzie nam jednak zaleĝaïo na zwiÚkszeniu tego odstÚpu albo przeciwnie —
na nieznacznym ĂcieĂnieniu kolumn. Bootstrap umoĝliwia takie modyfikacje za poĂrednic-
twem kolejnych klas, które naleĝy dodaÊ do kolumny.
Tak jak przy okreĂlaniu szerokoĂci, trzeba w tym celu uĝyÊ odpowiedniego prefiksu — tym
razem ze sïowem
offset
:
<div class="col-sm-4 col-sm-offset-1"></div>
W tej sytuacji liczba na koñcu oznacza liczbÚ kolumn siatki, wzglÚdem których chcesz doko-
naÊ przesuniÚcia kolumny projektu. W rezultacie zwiÚksza siÚ margines po jej lewej stronie.
PamiÚtaj, ĝe przesuniÚcia kolumn sÈ uwzglÚdniane w ïÈcznej liczbie 12 kolumn Bootstrapa w wierszu.
WewnÈtrz istniejÈcych kolumn moĝemy zagnieědziÊ kolejne wiersze i kolumny, aby otrzymaÊ
bardziej skomplikowany szablon. Zobaczmy:
<div class="container">
<div class="row">
<div class="col-sm-8">
<div class="row">
<div class="col-sm-6">
<p>Lorem ipsum dolor...<p>
</div>
<div class="col-sm-6">
<p>Class aptent taciti...</p>
</div>
</div>
</div>
</div>
</div>
Ten kod tworzy dwie kolumny w przeznaczonym na gïównÈ treĂÊ kontenerze, który przygotowali-
Ămy wczeĂniej. Aby byïo to widoczne, wstawiïem w te kolumny fragmenty tekstu roboczego.
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
35
JeĂli otworzysz tak przygotowany dokument w przeglÈdarce, zapewne zauwaĝysz, ĝe strona
zostaïa podzielona na trzy kolumny. DziÚki zagnieĝdĝeniu siatki zawsze moĝemy jednak
utworzyÊ nowy wiersz z jednÈ kolumnÈ, trzema kolumnami albo dowolnÈ ich liczbÈ, jaka bÚ-
dzie potrzebna.
Klasy pomocnicze
Bootstrap jest wyposaĝony w kilka klas pomocniczych, których moĝna uĝyÊ do dostosowania
projektu. SÈ to klasy uĝytkowe, majÈce jedno okreĂlone zastosowanie. Przyjrzyjmy siÚ kilku
przykïadom.
Elementy „pïywajÈce”
Zastosowanie elementów „pïywajÈcych” jest niekiedy konieczne do uzyskania oczekiwanej
struktury strony WWW. Bootstrap jest wyposaĝony w dwie klasy, umoĝliwiajÈce przesuwanie
elementów w lewÈ albo w prawÈ stronÚ:
<div class="pull-left">...</div>
<div class="pull-right">...</div>
Aby skutecznie siÚ posïugiwaÊ elementami „pïywajÈcymi”, trzeba je ujÈÊ w klasÚ
clearfix
. DziÚki
temu zostanÈ one wyodrÚbnione ze struktury dokumentu i nie bÚdÈ zaburzaïy jego ukïadu:
<div class="clearfix">
<div class="pull-left">...</div>
<div class="pull-right">...</div>
</div>
JeĂli klasy „pïywajÈce” zostanÈ uĝyte bezpoĂrednio w odniesieniu do elementu klasy
row
, to
nie trzeba dodatkowo troszczyÊ siÚ o rÚczne anulowanie „pïywania” za pomocÈ klasy
clearfix
,
poniewaĝ Bootstrap zrobi to automatycznie.
WyĂrodkowywanie elementów
Oprócz uaktywnienia „pïywania” czasami zachodzi potrzeba wyĂrodkowania elementów blo-
kowych. Bootstrap umoĝliwia to za poĂrednictwem klasy
center-block
:
<div class="center-block">...</div>
Powoduje ona ustawienie wïaĂciwoĂci
margin-left
i
margin-right
na
auto
, co w konsekwencji
wyĂrodkowuje element.
WyĂwietlanie i ukrywanie
Za pomocÈ CSS da siÚ ukrywaÊ i wyĂwietlaÊ elementy, a Bootstrap jest wyposaĝony w dwie
klasy, które to umoĝliwiajÈ:
<div class="show">...</div>
<div class="hidden">...</div>
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
36
Warto zauwaĝyÊ, ĝe klasa
show
powoduje zmianÚ sposobu wyĂwietlania elementu na blokowy,
naleĝy jej wiÚc uĝywaÊ tylko do elementów typu
block
, a nie wierszowych (
inline
) czy mie-
szanych (
inline-block
).
Bootstrap oferuje ponadto wiele klas umoĝliwiajÈcych ukrywanie i wyĂwietlanie elementów
przy okreĂlonych rozmiarach ekranu. Klasy te bazujÈ na tych samych predefiniowanych wiel-
koĂciach ekranu, co siatka Bootstrapa.
Na przykïad poniĝszy kod spowoduje ukrycie danego elementu przy okreĂlonej wielkoĂci ekranu:
<div class="hidden-md"></div>
NastÚpujÈcy kod zaĂ spowoduje ukrycie elementu na urzÈdzeniach Ăredniej wielkoĂci, ale
element ten bÚdzie nadal widoczny na telefonach, tabletach i zwykïych komputerach. Aby
ukryÊ element na róĝnych urzÈdzeniach, trzeba zastosowaÊ odpowiednio wiele klas:
<div class="hidden-md hidden-lg"></div>
Na tej samej zasadzie, tylko na odwrót, dziaïajÈ klasy uwidaczniajÈce elementy przy okreĂlo-
nych wielkoĂciach ekranu. Jednak w odróĝnieniu od klas typu
hidden
wymagajÈ one okreĂle-
nia metody wyĂwietlania:
block
,
inline
albo
inline-block
:
<div class="visible-md-block"></div>
<div class="visible-md-inline"></div>
<div class="visible-md-inline-block"></div>
OczywiĂcie poszczególnych klas moĝna uĝywaÊ w parach. JeĂli na przykïad chcielibyĂmy, aby
na mniejszym ekranie dany element byï wyĂwietlany jako blokowy, na wiÚkszym zaĂ —
w mieszanym trybie
inline-block
, moglibyĂmy uĝyÊ nastÚpujÈcego kodu:
<div class="visible-sm-block visible-md-inline-block"></div>
JeĂli zapomnisz nazw poszczególnych klas, po prostu ponownie zerknij do podpunktu „Kilka
sïów o systemie siatkowym Bootstrapa”.
Zastosowanie dyrektyw
MiaïeĂ juĝ okazjÚ uĝyÊ dyrektyw Angulara, choÊ na razie niewiele wspominaïem na ich te-
mat. W istocie sÈ to potÚĝne funkcje, które moĝna wywoïaÊ z poziomu atrybutu albo nawet
wïasnego niestandardowego elementu — w Angularze jest mnóstwo takich funkcji. DziÚki
nim operacje takie jak zapÚtlanie przetwarzania danych, obsïuga klikniÚÊ czy wysyïanie for-
mularzy sÈ szybkie i proste.
Po raz pierwszy uĝyïeĂ dyrektywy do zainicjalizowania Angulara na stronie; jak zapewne pa-
miÚtasz, byïa to dyrektywa
ng-app
. Wszystkich dyrektyw, z którymi bÚdziesz miaï do czynie-
nia w tym rozdziale, uĝywa siÚ podobnie — poprzez dodanie atrybutu do elementu.
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
37
Zanim przyjrzymy siÚ kolejnym wbudowanym dyrektywom, musimy napisaÊ prosty kontroler.
Utwórz nowy plik i nazwij go controller.js. Zapisz go w folderze js projektu i otwórz w edyto-
rze tekstowym.
Zgodnie z tym, czego dowiedziaïeĂ siÚ w rozdziale 1., zatytuïowanym „Witaj, {{imiÚ}}”, kon-
trolery to standardowe konstruktory JavaScript, do których moĝemy wstrzyknÈÊ (ang. inject) usïu-
gi Angulara, takie jak
$scope
. Instancje tych konstruktorów sÈ generowane w chwili wykrycia
przez Angulara atrybutu
ng-controller
. To oznacza, ĝe w ramach danej aplikacji moĝemy
dysponowaÊ wieloma instancjami danego kontrolera, to zaĂ pozwala na wielokrotne uĝytko-
wanie kodu. W wypadku naszego kontrolera wystarczy prosta deklaracja funkcji:
function AppCtrl(){
}
Aby poinformowaÊ Angulara, ĝe chcemy uĝyÊ tego kontrolera, powinniĂmy umieĂciÊ go na
stronie juĝ po zaïadowaniu biblioteki AngularJS. Musimy teĝ pamiÚtaÊ o dodaniu dyrektywy
ng-controller
do otwierajÈcego znacznika
<html>
:
<html ng-controller="AppCtrl">
…
<script type="text/javascript" src="assets/js/controller.js"></script>
Dyrektywy ng-click i ng-mouseover
JednÈ z najprostszych rzeczy, jakÈ moĝna zrobiÊ w JavaScripcie, jest przechwycenie zdarzenia
klikniÚcia. Moĝna tego dokonaÊ za pomocÈ atrybutu
onclick
dla elementu, biblioteki jQuery
albo detektora zdarzenia (ang. listener). W Angularze uĝywa siÚ do tego dyrektyw.
Aby zademonstrowaÊ ich dziaïanie, utworzymy przycisk powodujÈcy wyĂwietlenie okienka
z komunikatem — prosta sprawa. Najpierw dodajmy przycisk do przygotowanego wczeĂniej
obszaru treĂci:
<div class="col-sm-8">
<button>Kliknij mnie</button>
</div>
JeĂli otworzysz tak zmodyfikowanÈ stronÚ w przeglÈdarce, zobaczysz na niej zwykïy, standar-
dowy przycisk HTML, co nie powinno stanowiÊ zaskoczenia. Zanim doïÈczymy dyrektywÚ do
tego elementu, musimy jeszcze umieĂciÊ odpowiedni uchwyt w kontrolerze. BÚdzie to funk-
cja kontrolera, powiÈzana z jego zakresem. To bardzo waĝne, by funkcja byïa powiÈzana z za-
kresem, bo w przeciwnym razie nie bÚdzie do niej dostÚpu z poziomu widoku:
function AppCtrl($scope){
$scope.clickHandler = function(){
window.alert('KlikniÚty!');
};
}
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
38
Jak juĝ wiesz, na stronie moĝe funkcjonowaÊ wiele zakresów, które sÈ po prostu obiektami, do
których Angular umoĝliwia dostÚp widokom i kontrolerowi. Aby zapewniÊ ów dostÚp kontro-
lerowi, wstrzyknÚliĂmy do niego usïugÚ
$scope
. Usïuga ta zapewnia dostÚp do zakresu zwiÈ-
zanego z elementem, do którego dodaliĂmy atrybut
ng-controller
.
Funkcjonowanie Angulara w duĝej mierze opiera siÚ na wstrzykiwaniu zaleĝnoĂci — to pojÚcie,
z którym byÊ moĝe nie miaïeĂ dotychczas do czynienia. MogïeĂ siÚ juĝ przekonaÊ, ĝe Angular
jest podzielony na moduïy i usïugi. Kaĝdy moduï i usïuga sÈ zaleĝne od innych, a wstrzykiwa-
nie zaleĝnoĂci zapewnia przejrzystoĂÊ relacji miÚdzy nimi. Podczas testów jednostkowych
moĝna wstrzykiwaÊ specjalnie spreparowane obiekty, umoĝliwiajÈce zweryfikowanie popraw-
noĂci dziaïania danego elementu aplikacji. Wstrzykiwanie zaleĝnoĂci umoĝliwia poinformo-
wanie Angulara, od jakich usïug zaleĝy dziaïanie naszego kontrolera. Framework dba o to, by
usïugi te byïy dostÚpne.
Kompleksowe omówienie wstrzykiwania zaleĝnoĂci w AngularJS znajdziesz w oficjalnej do-
kumentacji pod adresem https://docs.angularjs.org/guide/di.
Uchwyt jest juĝ przygotowany, teraz trzeba jeszcze dodaÊ dyrektywÚ do przycisku. Tak jak
poprzednio, naleĝy to zrobiÊ w postaci dodatkowego atrybutu. Tym razem przekaĝemy do
niego nazwÚ funkcji, którÈ zamierzamy wykonaÊ, czyli w tym wypadku
clickHandler
. Angular
potraktuje caïÈ zawartoĂÊ dyrektywy jako wyraĝenie, trzeba zatem pamiÚtaÊ o dodaniu nawia-
sów wskazujÈcych, ĝe mamy do czynienia z funkcjÈ:
<button ng-click="clickHandler()">Kliknij mnie</button>
JeĂli teraz otworzysz tÚ stronÚ w przeglÈdarce, to po klikniÚciu przycisku pojawi siÚ na ekra-
nie okno komunikatu. Zauwaĝ, ĝe podczas wywoïywania funkcji nie musimy siÚ w widoku
odwoïywaÊ do zmiennej
$scope
. Funkcje i zmienne, z których moĝna skorzystaÊ w danym wi-
doku, funkcjonujÈ w bieĝÈcym zakresie lub dowolnym zakresie nadrzÚdnym.
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
39
JeĂli chcielibyĂmy wyĂwietliÊ okno komunikatu w reakcji na wskazanie elementu kursorem
myszy, a nie klikniÚcie, to wystarczyïoby zmieniÊ nazwÚ dyrektywy na
ng-mouseover
, gdyĝ
dziaïanie obydwu jest identyczne.
Dyrektywa ng-init
Dyrektywa
ng-init
sïuĝy do przetwarzania wyraĝeñ w bieĝÈcym zakresie i moĝe byÊ uĝywana
samodzielnie lub w poïÈczeniu z innymi dyrektywami. Ma ona wyĝszy priorytet niĝ inne dy-
rektywy, aby wyraĝenie zostaïo przetworzone odpowiednio wczeĂnie.
Oto prosty przykïad zastosowania dyrektywy
ng-init
:
<div ng-init="test = 'Witaj, Ăwiecie.'"></div>
{{test}}
Otwarcie strony z tym kodem w przeglÈdarce spowoduje wyĂwietlenie napisu „Witaj, Ăwie-
cie.”. Jak widaÊ, przypisaliĂmy wartoĂÊ modelowi o nazwie
test
, a potem — za pomocÈ
skïadni z podwójnymi nawiasami klamrowymi — wyĂwietliliĂmy jÈ na ekranie.
Dyrektywy ng-show i ng-hide
W pewnych sytuacjach przydaje siÚ moĝliwoĂÊ sterowania wyĂwietlaniem jakiegoĂ elementu
na drodze programowej. Dyrektywami
ng-show
i
ng-hide
moĝna sterowaÊ za poĂrednictwem
wartoĂci zwracanych przez funkcjÚ albo model.
Spróbujmy rozbudowaÊ utworzonÈ wczeĂniej funkcjÚ
clickHandler
, aby zademonstrowaÊ za-
stosowanie dyrektywy
ng-click
do przeïÈczania widocznoĂci elementu. Utworzymy w tym celu
nowy model i bÚdziemy sterowaÊ widocznoĂciÈ elementu poprzez przeïÈczanie miÚdzy logicznÈ
prawdÈ a faïszem.
Zacznijmy od utworzenia elementu, który bÚdziemy ukrywaÊ i wyĂwietlaÊ. W kodzie pod
przyciskiem umieĂÊ nastÚpujÈcy fragment:
<div ng-hide="isHidden">
Kliknij przycisk powyĝej, aby przeïÈczyÊ widocznoĂÊ.
</div>
Modelem jest tutaj wartoĂÊ atrybutu
ng-hide
. Poniewaĝ funkcjonuje on w ramach naszego za-
kresu, moĝemy ïatwo zmodyfikowaÊ go za poĂrednictwem kontrolera:
$scope.clickHandler = function(){
$scope.isHidden = !$scope.isHidden;
};
Ten kod po prostu zamienia wartoĂÊ modelu na przeciwnÈ, co w rezultacie przeïÈcza widocz-
noĂÊ elementu
<div>
.
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
40
JeĂli wypróbujesz ten przykïad w przeglÈdarce, okaĝe siÚ, ĝe element nie jest domyĂlnie
ukryty. Istnieje kilka sposobów na zmianÚ tego stanu rzeczy. Pierwszy polega na ustawieniu
wartoĂci
$scope.isHidden
na
true
w kontrolerze. Moĝna teĝ zmieniÊ wartoĂÊ tej zmiennej na
true
za pomocÈ dyrektywy
ng-init
. Ewentualnie moglibyĂmy uĝyÊ dyrektywy
ng-show
, która
dziaïa odwrotnie niĝ
ng-hide
i wyĂwietla element wtedy, gdy wartoĂÊ modelu wynosi
true
.
PamiÚtaj o zaïadowaniu Angulara w nagïówku strony, bo w przeciwnym razie dyrektywy ng-hide
i ng-show nie zadziaïajÈ. To dlatego, ĝe Angular korzysta z wïasnych klas do ukrywania elementów
i muszÈ one zostaÊ zaïadowane przed wyĂwietleniem strony.
Dyrektywa ng-if
Angular jest ponadto wyposaĝony w dyrektywÚ
ng-if
, której dziaïanie jest podobne do
ng-show
i
ng-hide
. Z tym ĝe
ng-if
fizycznie usuwa element z drzewa DOM, podczas gdy
ng-show
i
ng-hide
tylko przeïÈczajÈ jego widocznoĂÊ.
Przyjrzyjmy siÚ, jak moĝna uĝyÊ dyrektywy
ng-if
w odniesieniu do poprzedniego kodu:
<div ng-if="isHidden">
Kliknij przycisk powyĝej, aby przeïÈczyÊ widocznoĂÊ.
</div>
JeĂli chcielibyĂmy odwróciÊ dziaïanie instrukcji, wystarczyïoby poprzedziÊ wyraĝenie wykrzyk-
nikiem:
<div ng-if="!isHidden">
Kliknij przycisk powyĝej, aby przeïÈczyÊ widocznoĂÊ.
</div>
Dyrektywa ng-repeat
Podczas projektowania aplikacji internetowej zapewne bardzo szybko staniesz przed koniecz-
noĂciÈ wygenerowania tablicy elementów. Na przykïad w naszym menedĝerze kontaktów bÚ-
dzie to lista kontaktów, ale moĝe to byÊ cokolwiek innego. Angular umoĝliwia realizowanie
tego typu zadañ za pomocÈ dyrektywy
ng-repeat
.
Oto przykïadowe dane, z którymi moglibyĂmy mieÊ do czynienia. Jak widaÊ, jest to tablica
obiektów z wieloma wïaĂciwoĂciami. Aby wyĂwietliÊ dane, trzeba bÚdzie odwoïaÊ siÚ do kaĝ-
dej z tych wïaĂciwoĂci. Na szczÚĂcie dyrektywa
ng-repeat
poradzi sobie z tym doskonale.
Oto kontroler z tablicÈ obiektów z danymi, przypisanÈ do modelu
contacts
:
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
41
function AppCtrl($scope){
$scope.contacts = [
{
name: 'Janko Walski',
phone: '01234567890',
email: 'janko@walski.com'
},
{
name: 'Karen Nerka',
phone: '09876543210',
email: 'karenne@email.com'
}
];
}
Mamy tutaj do czynienia z zaledwie dwiema osobami, ale nietrudno sobie wyobraziÊ, ĝe ta-
blica mogïaby zawieraÊ setki kontaktów pozyskanych za poĂrednictwem API, a z takÈ iloĂciÈ
informacji trudno byïoby pracowaÊ bez dyrektywy
ng-repeat
.
Zacznij od umieszczenia w kontrolerze tablicy kontaktów i przypisania jej do wïaĂciwoĂci
$scope.contacts
. NastÚpnie otwórz plik index.html i utwórz znacznik
<ul>
. Poniewaĝ bÚ-
dziemy wielokrotnie powtarzaÊ caïy punkt nienumerowanej listy, dyrektywÚ
ng-repeat
trzeba
dodaÊ do elementu
<li>
:
<ul>
<li ng-repeat="contact in contacts"></li>
</ul>
JeĂli wiesz, jak funkcjonujÈ pÚtle w PHP albo w Ruby, to poczujesz siÚ jak w domu. Utworzymy
zmiennÈ, do której bÚdziemy mogli siÚ odwoïaÊ w ramach powtarzanego elementu. Zmienna
po sïowie kluczowym
in
odwoïuje siÚ do modelu powiÈzanego z obiektem
$scope
w naszym
kontrolerze. W rezultacie moĝemy odwoïaÊ siÚ do dowolnej wïaĂciwoĂci tego obiektu, zysku-
jÈc nowy zakres przy kaĝdej iteracji albo nowej pozycji. WïaĂciwoĂci te moĝemy wyĂwietliÊ
na stronie za pomocÈ skïadni z podwójnym nawiasem klamrowym Angulara, zgodnie z infor-
macjami podanymi w rozdziale 1., zatytuïowanym „Witaj, {{imiÚ}}”:
<ul>
<li ng-repeat="contact in contacts">
{{contact.name}}
</li>
</ul>
Powyĝszy kod, zgodnie z oczekiwaniami, spowoduje wyĂwietlenie imion i nazwisk z naszej listy.
W analogiczny sposób moĝemy ïatwo odwoïaÊ siÚ do dowolnej wïaĂciwoĂci obiektu
contacts
,
korzystajÈc ze standardowej skïadni z kropkÈ.
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
42
Dyrektywa ng-class
CzÚsto zachodzi potrzeba zmodyfikowania klasy albo dodania jej do elementu w sposób pro-
gramowy. W tym celu moĝemy uĝyÊ dyrektywy
ng-class
. Umoĝliwia ona zdefiniowanie klasy
do dodania lub usuniÚcia, w zaleĝnoĂci od wartoĂci modelu.
DyrektywÈ
ng-class
moĝna siÚ posïuĝyÊ na dwa sposoby. W najprostszej postaci Angular po
prostu uĝyje wartoĂci modelu jako klasy CSS elementu:
<div ng-class="exampleClass"></div>
JeĂli model, do którego siÚ odwoïujemy, bÚdzie niewïaĂciwy lub zwróci faïsz logiczny, klasa
nie zostanie zastosowana. Takie rozwiÈzanie dobrze sprawdza siÚ przy pojedynczych klasach,
ale jeĂli chciaïbyĂ mieÊ trochÚ wiÚkszÈ kontrolÚ nad caïym procesem albo zastosowaÊ wiele
klas do jednego elementu, wypróbuj poniĝszÈ skïadniÚ:
<div ng-class="{className: model, class2: model2}"></div>
To podejĂcie jest trochÚ inne. Mamy zbiór nazw klas poïÈczonych z modelami, których war-
toĂÊ chcemy sprawdziÊ. JeĂli model zwróci wartoĂÊ
true
, klasa zostanie dodana do elementu.
Przyjrzyjmy siÚ temu w praktyce. Uĝyjemy pól wyboru i atrybutu
ng-model
, poznanego przez
Ciebie w rozdziale 1. „Witaj, {{imiÚ}}”, do przypisania kilku klas do akapitu:
<p ng-class="{'text-center': center, 'text-danger': error}">
Lorem ipsum dolor sit amet
</p>
Wykorzystaïem tutaj dwie klasy Bootstrapa:
text-center
oraz
text-danger
. Ich zastosowanie
jest uzaleĝnione od dwóch modeli, na które moĝemy wpïywaÊ przy uĝyciu pól wyboru:
<label><input type="checkbox" ng-model="center">tekst wyĂrodkowany</label>
<label><input type="checkbox" ng-model="error">tekst ostrzegawczy</label>
Ujmowanie nazw klas w pojedyncze cudzysïowy jest potrzebne, tylko jeĂli zawierajÈ one myĂlniki; w przeciw-
nym razie bowiem Angular wygeneruje bïÈd.
Zaznaczenie pól spowoduje zastosowanie odpowiednich klas wzglÚdem podanego wczeĂniej
elementu.
Dyrektywa ng-style
Ta dyrektywa sïuĝy do dynamicznej zmiany stylu elementu za poĂrednictwem Angulara, na
podobnej zasadzie co
ng-class
. Aby to zademonstrowaÊ, utworzymy trzecie pole wyboru, któ-
re doda nowe style do poprzedniego elementu — akapitu.
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
43
Dyrektywa
ng-style
bazuje na standardowym obiekcie JavaScript, gdzie klucze obiektu od-
powiadajÈ stylom przeznaczonym do zmiany (takim jak kolor albo tïo). Moĝna je zastosowaÊ
z poziomu modelu lub za poĂrednictwem wartoĂci zwróconej przez funkcjÚ.
Zobaczmy, jak powiÈzaÊ tÚ dyrektywÚ z funkcjÈ sprawdzajÈcÈ stan modelu. DziÚki temu bÚ-
dziemy mogli wïÈczaÊ i wyïÈczaÊ style przy uĝyciu pola wyboru.
Najpierw otwórz plik controller.js i utwórz nowÈ funkcjÚ powiÈzanÈ z zakresem. SwojÈ funk-
cjÚ nazwaïem
styleDemo
:
$scope.styleDemo = function(){
if(!$scope.styler){
return;
}
return {
background: 'red',
fontWeight: 'bold'
};
};
WewnÈtrz funkcji musimy sprawdziÊ wartoĂÊ modelu, który w tym wypadku nosi nazwÚ
styler
.
JeĂli bÚdzie to wartoĂÊ
false
, nie musimy niczego zwracaÊ — w przeciwnym razie zwracamy
obiekt z wïaĂciwoĂciami CSS. Zauwaĝ, ĝe w zwróconym obiekcie uĝyliĂmy nazwy wïaĂciwoĂci
w formie
fontWeight
zamiast
font-weight
. Obie nazwy zadziaïajÈ, a Angular automatycznie prze-
ïÈczy zapis w stylu CamelCase na odpowiedniÈ nazwÚ wïaĂciwoĂci CSS. Trzeba jedynie pamiÚtaÊ,
ĝe jeĂli klucze obiektu JavaScript zawierajÈ myĂlniki, klucze te trzeba ujÈÊ w cudzysïowy.
Ten model zostanie powiÈzany z polem wyboru, tak jak zrobiliĂmy to w wypadku dyrektywy
ng-class
:
<label><input type="checkbox" ng-model="styler">ng-style</label>
Ostatnia rzecz polega na dodaniu dyrektywy
ng-style
do elementu akapitu:
<p .. ng-style="styleDemo()">
Lorem ipsum dolor sit amet
</p>
Angular jest na tyle „sprytny”, ĝe wywoïa tÚ funkcjÚ ponownie przy kaĝdej zmianie zakresu.
To oznacza, ĝe gdy tylko wartoĂÊ modelu zmieni siÚ z
false
na
true
, nasz styl zostanie wïÈ-
czony, a w sytuacji odwrotnej — wyïÈczony.
Dyrektywa ng-cloak
Na koniec przyjrzymy siÚ dyrektywie
ng-cloak
. JeĂli w kodzie strony HTML zostanÈ zastoso-
wane szablony Angulara, to podczas wyĂwietlania strony w przeglÈdarce — tuĝ przed wczyta-
niem AngularJS i skompilowaniem kodu — na ekranie przez chwilÚ bÚdÈ widoczne podwójne
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
44
nawiasy klamrowe. Aby tego uniknÈÊ, moĝna tymczasowo ukryÊ szablon aĝ do chwili jego
peïnego przetworzenia.
W Angularze sïuĝy do tego dyrektywa
ng-cloak
. Definiuje ona dla wczytywanego elementu
dodatkowÈ reguïÚ w postaci
display: none !important;
.
Aby mieÊ pewnoĂÊ, ĝe podczas wczytywania strony nic nie bÚdzie migaÊ, naleĝy pamiÚtaÊ o zaïadowa-
niu Angulara w nagïówku (<head>) strony HTML.
Pytania sprawdzajÈce
1. Co dodaliĂmy na górze strony, aby umoĝliwiÊ przeïÈczanie miÚdzy widokami?
2. Z ilu kolumn skïada siÚ system siatkowy Bootstrapa?
3. Co to sÈ dyrektywy i jak siÚ najczÚĂciej ich uĝywa?
4. JakÈ dyrektywÚ zastosowaïbyĂ do zapÚtlenia przetwarzania danych?
Podsumowanie
W tym rozdziale omówiliĂmy wiele zagadnieñ, zanim wiÚc przejdziemy do kolejnego, pod-
sumujmy zdobyte wiadomoĂci.
Bootstrap pozwoliï nam bïyskawicznie opracowaÊ responsywnÈ nawigacjÚ. Aby umoĝliwiÊ korzy-
stanie z nawigacji dostosowanej do urzÈdzeñ mobilnych, musieliĂmy doïÈczyÊ do projektu
plik JavaScript znajdujÈcy siÚ w archiwum z Bootstrapem.
PrzyjrzeliĂmy siÚ teĝ responsywnemu mechanizmowi siatkowemu o ogromnych moĝliwoĂciach,
na którym opiera siÚ Bootstrap, i utworzyliĂmy prosty, dwukolumnowy ukïad treĂci. Przy oka-
zji zapoznaliĂmy siÚ z czterema prefiksami dla róĝnych klas kolumn oraz z zagnieĝdĝaniem
elementów siatki. Aby przystosowaÊ ukïad strony do naszych potrzeb, wspomnieliĂmy po-
nadto o kilku dostÚpnych w Bootstrapie klasach pomocniczych, odpowiedzialnych za „pïywa-
nie”, wyĂrodkowywanie i ukrywanie elementów.
W tym rozdziale zapoznaliĂmy siÚ teĝ z wbudowanymi dyrektywami Angulara: funkcjami,
które Angular pozwala wywoïywaÊ z poziomu widoku. Zanim siÚ nimi zajÚliĂmy, musieliĂmy
utworzyÊ tak zwany kontroler, czyli funkcjÚ, do której moĝemy przekazywaÊ usïugi Angulara
za poĂrednictwem procesu zwanego wstrzykiwaniem zaleĝnoĂci.
Dyrektywy omówione w tym rozdziale bÚdÈ odgrywaïy bardzo waĝnÈ rolÚ w programowaniu
menedĝera kontaktów w dalszej czÚĂci ksiÈĝki. Dyrektywy takie jak
ng-click
i
ng-mouseover
Rozdziaá 2. • Projektowanie za pomocą AngularJS i Bootstrapa
45
sÈ po prostu nowymi sposobami obsïugi zdarzeñ, które dotychczas z pewnoĂciÈ obsïugiwaïeĂ
w inny sposób, na przykïad za poĂrednictwem jQuery albo czystego JavaScriptu. Z kolei dy-
rektywy w rodzaju
ng-repeat
zapewne bÚdÈ dla Ciebie nowoĂciÈ. „PrzemycajÈ” one do wido-
ku pewne przydatne mechanizmy, na przykïad pÚtle umoĝliwiajÈce cykliczne przetwarzanie
danych i wyĂwietlanie ich na stronie.
PrzyjrzeliĂmy siÚ teĝ dyrektywom, które ĂledzÈ modele w danym zakresie i zaleĝnie od ich
wartoĂci wykonujÈ róĝne dziaïania. Z kolei dyrektywy takie jak
ng-show
i
ng-hide
umoĝliwiajÈ
wyĂwietlenie elementu na podstawie wartoĂci modelu. Kolejnym przykïadem byïa dyrektywa
ng-class
, która — na bazie wartoĂci modeli — umoĝliwiïa nam dodanie do elementów pew-
nych klas CSS.
Projektowanie nowoczesnych aplikacji sieciowych z uĪyciem AngularJS i Bootstrapa
46
Skorowidz
A
analiza wydajnoĂci, 174
AngularStrap, 103
automatyzacja, 149
zadañ, 129, 141
B
Bootstrap, 145
budowanie widoków, 67
C
CRUD, 79
create, 94
delete, 100
read, 79
update, 95
D
debugowanie, 52
detektor zdarzenia, listener, 37
dokumentacja, 197
domieszki, 154
dostosowywanie Bootstrapa, 145
dwukierunkowe wiÈzanie danych, 23
dyrektywa, 36
max, 167
maxlength, 167
min, 167
minlength, 167
ng-class, 42, 93
ng-click, 37
ng-cloak, 43
ng-hide, 39
ng-if, 40
ng-init, 39
ng-keyup, 93
ng-mouseover, 37
ng-pattern, 166
ng-repeat, 40, 52, 53
ngRoute, 60
ng-show, 39
ng-style, 42
ng-view, 61, 62
dyrektywy niestandardowe, 86
E
elementy pïywajÈce, 35
F
filtr
Filter, 51
limitTo, 49
paragraph, 91
filtry, 47
data, 49
liczby, 48
moduïy, 55
tworzenie, 55, 56
waluta, 48
wielkie litery, 49
formularze, 156, 161
poziome, 72
funkcja console.log, 117
Skorowidz
206
G
Gravatar, 74
Grunt, 131
H
Hero Unit, 24
HTML5Mode, 64
I
importowanie, 152
informacje z serwera, 120
inicjalizowanie, 19
inspekcja obiektu scope, 173
instalowanie
AngularJS, 19
AngularStrapa, 103
Bataranga, 172
Bootstrapa, 18
gulpa, 137
Grunta, 131
ng-annotate, 177
ngRoute, 59
Node, 129
NPM, 129
wiersza poleceñ, 131
integrowanie AngularStrapa, 110
J
JavaScript, 53
JSON, 52
Jumbotron, 24
K
klasa form-horizontal, 75
kolor tïa, 69
kolumny siatki, 33
kompilowanie, 146, 149
plików Less, 145
komponent navbar, 30
komunikacja z serwerem, 115
komunikat o bïÚdzie, 62
konfigurowanie
ngResource, 119
pakietu watch, 136
pliku Gruntfile, 131
pliku gulpfile, 138
routera, 60
zadania, 179
kontroler, 96
ïañcuchowanie tras, 61
ïÈczenie elementów, 97
M
menedĝer kontaktów, 59, 67
metoda value, 82
metody ïÈczenia z serwerem, 124
minifikacja, 19
moduï, 55
ngResource, 118
motywy Bootstrapa, 158
N
narzÚdzie, 171
Batarang, 171
Grunt, 146, 178
gulp, 149
ng-annotate, 177
nawigacja, 30
niestandardowe usïugi, 81
NPM, Node Package Manager, 129
O
obiekt
$rootScope, 80
scope, 173
obietnice, promises, 117
obsïuga
bïÚdów, 124
RestAngulara, 125
odsyïacze do tras, 65
okienka wyskakujÈce, 107
okienko podpowiedzi, 105
okno modalne, 105
opcje Bataranga, 176
ostrzeĝenia, 108
Skorowidz
207
P
pakiet watch, 136
parametry routingu, 85
pasek nawigacji, 155
plik
Gruntfile.js, 132
gulpfile, 138
package.json, 131
pliki
Less, 145
lokalizacyjne, 48
plugin
less, 149
LiveReload, 147, 150
Watch, 147, 150
podpinanie ngResource, 119
pomoc, 197
preprocesor Less, 152
priorytet urzÈdzeñ mobilnych, 23
projekt
AngularGM, 195
AngularMotion, 193
AngularStrap, 193
AngularUI, 193
BootSnipp, 190
Bootstrap Expo, 190
Bootstrap Icons, 192
Font Awesome, 192
gulp, 137
Ionic, 194
Mobile AngularUI, 194
ng-annotate, 177
RestAngular, 193
Roots, 191
Shoelace, 191
Sublime Text, 191
projektowanie, 29
przesyïanie danych, 118
przewodnik kodowania, 190
przyciski, 157
R
reguïy zagnieĝdĝone, 153
RestAngular, 124
RESTful, 115
routing, 59
S
serwer, 115
serwis
Egghead.io, 198
GitHub, 197
Stack Overflow, 198
sieÊ CDN, 18
singleton, 82
sortowanie, 52
stosowanie
filtrów, 47, 53
ng-annotate, 185
strony aktywne, 92
struktura folderów, 30, 141
style Bootstrapa, 154
symbol kratki, 64
system siatkowy, 32
szablon HTML, 61
T
trasa, route, 59
domyĂlna, 64
podstawowa, 60
z parametrami, 63
tworzenie
filtra, 55, 56
moduïu, 55
niestandardowego walidatora, 167
niestandardowej usïugi, 81
pliku Gruntfile.js, 132
pliku package.json, 131
tras podstawowych, 60
zadania domyĂlnego, 137
typografia, 154
U
uruchamianie Grunta, 135
usïuga
$http, 116
factory, 82
Firebase, 125
service, 83
value, 82
Skorowidz
208
usïugi
AngularStrapa, 109
niestandardowe, 81
wïasne, 84
usuwanie kontaktów, 123
W
walidacja, 161
walidator niestandardowy, 167
weryfikacja formularzy, 161
widok, 67
Dodaj kontakt, 70
Indeks, 67
WyĂwietl kontakt, 73
wiersz poleceñ, 131
wizualizacja zaleĝnoĂci, 175
wïaĂciwoĂÊ scope, 96
wïÈczanie HTML5Mode, 64
wspóïdzielenie danych, 80
wstrzykiwanie zaleĝnoĂci, 38
wyraĝenie, 21
wysyïanie danych, 121
wyĂrodkowywanie elementów, 35
wyĂwietlanie elementów, 35
Z
zakoñczenie linii, 91
zaleĝnoĂci, 175
gulpa, 137
zastosowanie
AngularJS, 20
AngularStrapa, 104
Grunta, 131
gulpa, 137
usïug AngularStrapa, 109
zmienne, 152