44

Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale
Page 2: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Tytuł oryginału: AngularJS

Tłumaczenie: Robert Górczyński

ISBN: 978-83-246-9990-2

© 2014 Helion S.A.

Authorized Polish translation of the English edition AngularJS, ISBN 9781449344856 © 2013 Brad Green and Shyam Seshadri.

This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

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 bierze jednak żadnej odpowiedzialności aniza ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowychlub autorskich. Wydawnictwo HELION nie ponosi również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: 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/angula.zip

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/angulaMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Page 3: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

3

Spis tre ci

Wprowadzenie ........................................................................................... 7Konwencje zastosowane w ksi ce 8U ycie przyk adowych kodów 8Podzi kowania 9

Rozdzia 1. Wprowadzenie do AngularJS ................................................11Koncepcje 12Przyk ad — koszyk na zakupy 18Co dalej? 21

Rozdzia 2. Anatomia aplikacji AngularJS ...............................................23Wywo anie AngularJS 23Architektura MVC 24Szablony i do czanie danych 27Organizacja zale no ci za pomoc modu ów 51Formatowanie danych za pomoc filtrów 55Zmiana widoków za pomoc tras i us ugi $location 57Komunikacja z serwerem 61U ycie dyrektyw do zmiany elementów drzewa DOM 63Weryfikacja danych wej ciowych u ytkownika 65Co dalej? 67

Rozdzia 3. Programowanie w AngularJS ...............................................69Organizacja projektu 70Narz dzia 73Uruchamianie aplikacji 75Testowanie w AngularJS 76Testy jednostkowe 79

Kup książkę Poleć książkę

Page 4: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

4 Spis tre ci

Testy typu E2E/integracji 80Kompilacja 82Inne wspania e narz dzia 84Narz dzie Yeoman — optymalizacja sposobu pracy 88Integracja AngularJS i RequireJS 92

Rozdzia 4. Analiza aplikacji AngularJS .................................................101Aplikacja 101Relacje mi dzy modelem, kontrolerem i szablonem 102Kontrolery, dyrektywy i us ugi 105Testy 122

Rozdzia 5. Komunikacja z serwerami .................................................. 129Komunikacja za pomoc us ugi $http 129Testy jednostkowe 135Praca z zasobami RESTful 137Us uga $q i obietnica 143Przechwycenie odpowiedzi 145Kwestie bezpiecze stwa 146XSRF 147

Rozdzia 6. Dyrektywy ........................................................................... 149Dyrektywy i weryfikacja kodu HTML 149Ogólny opis API 150Co dalej? 170

Rozdzia 7. Inne kwestie ......................................................................... 171Us uga $location 171Metody modu u AngularJS 178Komunikacja mi dzy zasi gami

za pomoc $on, $emit i $broadcast 182Ciasteczka 184Internacjonalizacja i lokalizacja 185Oczyszczanie kodu HTML i modu Sanitize 188

Kup książkę Poleć książkę

Page 5: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Spis tre ci 5

Rozdzia 8. ci ga i podpowiedzi ...........................................................191Opakowanie kontrolki jQuery datepicker 191Lista klubów sportowych — filtrowanie i komunikacja 196Przekazywanie plików w aplikacji AngularJS 201U ycie biblioteki Socket.IO 204Prosta us uga stronicowania 207Praca z serwerami i logowaniem 210Podsumowanie 214

Skorowidz ............................................................................................... 216

Kup książkę Poleć książkę

Page 6: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

6 Spis tre ci

Kup książkę Poleć książkę

Page 7: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

101

ROZDZIA 4.

Analiza aplikacji AngularJS

W rozdziale 2. przedstawiono pewne najcz ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale 3. zaj li my si zagadnieniami zwi -zanymi ze sposobem prowadzenia prac programistycznych. Zamiast konty-nuowa w tek i podobnie szczegó owo omawia poszczególne funkcje,w tym rozdziale przejdziemy do ma ej, rzeczywistej aplikacji. Na jej pod-stawie dowiesz si , jak po czy ze sob omówione dot d fragmenty ca o cii utworzy rzeczywist , dzia aj c aplikacj .

Zamiast od razu przedstawia ca aplikacj , b dziemy j poznawa w ma-ych cz ciach, omawia interesuj ce zagadnienia zwi zane z danym frag-mentem i tym samym powoli budowa kompletn aplikacj , która b dziegotowa, zanim uko czysz lektur rozdzia u.

AplikacjaGutHub to prosta aplikacja przeznaczona do zarz dzania przepisami kuli-narnymi. Zosta a zaprojektowana w taki sposób, aby przechowywa przepi-sy kulinarne i jednocze nie pokazywa ró ne interesuj ce aspekty aplikacjiAngularJS. Oto cechy charakteryzuj ce tworzon przez nas aplikacj :

ma uk ad sk adaj cy si z dwóch kolumn;

pasek nawigacyjny znajduje si po lewej stronie;

pozwala na dodawanie nowych przepisów kulinarnych;

umo liwia przegl danie istniej cych przepisów kulinarnych.

Widok g ówny aplikacji znajduje si po prawej stronie. W zale no ci odadresu URL ulega ona zmianie i wy wietla list przepisów kulinarnych,

Kup książkę Poleć książkę

Page 8: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

102 Rozdzia 4. Analiza aplikacji AngularJS

szczegó y dotycz ce konkretnego przepisu lub edytowalny formularz po-zwalaj cy na dodanie nowego b d na edycj istniej cego. Uruchomionaplikacj pokazano na rysunku 4.1.

Rysunek 4.1. GutHub, czyli prosta aplikacja przeznaczona do zarz dzania przepisamikulinarnymi

Ca a aplikacja jest dost pna w repozytorium GitHub na stronie: https://github.com/shyamseshadri/angularjs-book/tree/master/chapter4.

Relacje mi dzy modelem,kontrolerem i szablonemZanim przejdziemy do omawiania aplikacji, zatrzymajmy si na chwili zastanówmy, jak trzy fragmenty aplikacji wspó dzia aj ze sob oraz jakpowinni my je traktowa .

Model jest istot aplikacji. Powtórz to zdanie kilkakrotnie. Dzia anie ca ejaplikacji opiera si na modelu, od którego zale : wy wietlany widok, danewy wietlane przez widok, zapisywane informacje i dos ownie wszystko.Warto wi c po wi ci nieco czasu i dok adnie przemy le model — jakiew a ciwo ci powinien mie obiekt modelu, jak b dzie pobierany z serwera,jak b dzie zapisywany i tak dalej. Ze wzgl du na to, e uaktualnienie wido-ku nast puje automatycznie dzi ki u yciu wi zania danych, uwag nale yskoncentrowa na modelu.

Kup książkę Poleć książkę

Page 9: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Relacje mi dzy modelem, kontrolerem i szablonem 103

Kontroler zawiera logik biznesow i okre la mi dzy innymi: jak b dzie po-bierany model, jakie b d rodzaje operacji przeprowadzanych na modelu, ja-kich informacji widok potrzebuje z modelu, a tak e jak przekszta ci model,aby uzyska potrzebne dane. Ponadto przeprowadzanie weryfikacji, wy-konywanie wywo a do serwera, umieszczanie odpowiednich danych w wi-doku oraz w a ciwie wszystko inne powi zane z wymienionymi dzia ania-mi to równie aktywno definiowana w kontrolerze.

I na koniec szablon okre la sposób prezentacji modelu oraz interakcji u yt-kownika z aplikacj . Zadania wykonywane przez szablon powinny by ogra-niczone do wymienionych poni ej:

wy wietlanie modelu;

definiowanie sposobów, na jakie u ytkownik mo e korzysta z aplikacji— klikni cia, pola danych wej ciowych i tak dalej;

nadawanie stylu aplikacji oraz okre lanie, jak i kiedy pewne elementymaj by wy wietlane — pokazywanie lub ukrywanie i tak dalej;

filtrowanie i formatowanie danych (zarówno wej ciowych, jak i wyj-ciowych).

Trzeba pami ta , e szablon w AngularJS niekoniecznie jest widokiemw architekturze MVC (model – widok – kontroler). Zamiast tego widok jestskompilowan wersj wykonywanego szablonu, rodzajem po czenia sza-blonu i modelu.

W szablonie nie nale y umieszcza adnego rodzaju logiki biznesowejani definiowa zachowania — tego rodzaju dane powinny znajdowa siw kontrolerze. Zachowanie prostoty szablonów pozwala na w a ciw sepa-racj obowi zków, a ponadto na przetestowanie wi kszo ci kodu za po-moc jedynie testów jednostkowych. Szablony powinny by testowane zapomoc testów scenariuszy.

W tym miejscu móg by zapyta : gdzie nale y umieszcza polecenia od-powiedzialne za modyfikacje obiektowego modelu dokumentu? Operacjena elementach drzewa DOM nie powinny by definiowane w kontrolerachlub szablonach. Najlepszym miejscem dla nich s dyrektywy AngularJS,cho czasami wspomniane operacje mog by stosowane za pomoc us ug,co pozwala na unikni cie powielania kodu. Przyk ad takiego rozwi zaniaw aplikacji GutHub równie zostanie zaprezentowany i omówiony.

Bez zb dnych ceregieli przechodzimy wi c do modelu.

Kup książkę Poleć książkę

Page 10: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

104 Rozdzia 4. Analiza aplikacji AngularJS

ModelW omawianej aplikacji staramy si zachowa maksymaln prostot modelu— b d to po prostu przepisy kulinarne. Wspomniane przepisy to jedynyobiekt modelu w ca ej aplikacji. Wszystkie pozosta e komponenty zostanzbudowane wokó modelu.

Ka dy przepis sk ada si z nast puj cych w a ciwo ci:

identyfikator, je li przepis zosta zapisany na serwerze,

nazwa,

krótki opis,

sposób przygotowania,

informacje o ewentualnym wyró nieniu przepisu,

tablica sk adników podanych w postaci nazwy, ilo ci i jednostki miary.

I to tyle, model jest niezwykle prosty. Pozosta e komponenty aplikacji utwo-rzymy na podstawie wymienionego modelu. Poni ej przedstawiono przy-k adowy przepis kulinarny w formacie JSON (przepis ten zosta pokazanyna rysunku 4.1 we wcze niejszej cz ci rozdzia u):

{ "id": "1", "title": "Ciasteczka", "description": "Wyborne, chrupi ce na zewn trz, ci gliwe" + " w rodku i ociekaj ce pyszn czekolad " + "ciasteczka. Najlepsze w swoim rodzaju.", "ingredients": [ { "amount": "1", "amountUnits": "opakowanie", "ingredientName": "Chips Ahoy" } ], "instructions": "1. Kup opakowanie Chips Ahoy\n" + "2. Podgrzej ciasteczka w piekarniku\n" + "3. Rozsmakuj si w ciep ych ciasteczkach\n" + "4. Z innego ród a naucz si , jak wypieka wyborne ciasteczka"}

W celu zachowania prostoty przyk adu nie b dziemy zajmowa si serwe-rem, z którego przepisy kulinarne s pobierane lub w którym s zapisy-wane. Kod serwera znajduje si w repozytorium w serwisie GitHub, a dojego uruchomienia s u y polecenie node web-server.js, które trzeba wydaz poziomu podstawowego katalogu aplikacji GutHub. Przechodzimy terazdo znacznie bardziej skomplikowanych funkcji interfejsu u ytkownika, jakiemo na utworzy na postawie naszego prostego modelu.

Kup książkę Poleć książkę

Page 11: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 105

Kontrolery, dyrektywy i us ugiWreszcie mo emy zaj si ciekawszymi aspektami tworzonej przez nasaplikacji. W pierwszej kolejno ci spojrzymy na kod dyrektyw i us ug i po-wiemy sobie nieco o sposobie jego dzia ania. Nast pnie przejdziemy dowielu kontrolerów niezb dnych do zapewnienia prawid owego dzia aniatworzonej aplikacji.

Us ugiPoni ej przedstawiono kod ród owy us ug.

// Plik: app/scripts/services/services.js.var services = angular.module('guthub.services', ['ngResource']);

services.factory('Recipe', ['$resource', function($resource) { return $resource('/recipes/:id', {id: '@id'});}]);

services.factory('MultiRecipeLoader', ['Recipe', '$q', function(Recipe, $q) { return function() { var delay = $q.defer(); Recipe.query(function(recipes) { delay.resolve(recipes); }, function() { delay.reject('Nie mo na pobra przepisów kulinarnych.'); }); return delay.promise; };}]);

services.factory('RecipeLoader', ['Recipe', '$route', '$q', function(Recipe,$route, $q) { return function() { var delay = $q.defer(); Recipe.get({id: $route.current.params.recipeId}, function(recipe) { delay.resolve(recipe); }, function() { delay.reject('Nie mo na pobra przepisu ' + $route.current.params.recipeId); }); return delay.promise; };}]);

Najpierw zajmiemy si us ugami. Nie jest to nasze pierwsze spotkaniez us ugami — zetkn li my si z nimi ju w rozdziale 2. Tutaj zostan omó-wione nieco dok adniej.

W przedstawionym pliku znajduj si trzy us ugi AngularJS.

Kup książkę Poleć książkę

Page 12: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

106 Rozdzia 4. Analiza aplikacji AngularJS

Istnieje us uga przepisu kulinarnego, która zwraca tak zwany AngularJSResource. Jest to zasób RESTful prowadz cy do serwera RESTful. Wspo-mniany zasób hermetyzuje dzia aj c na niskim poziomie us ug $http, a tymsamym programista musi utworzy jedynie kod odpowiedzialny za pracz obiektami.

Za pomoc tylko pojedynczego wiersza kodu (return $resource) oraz oczywi-cie zale no ci w module guthub.services obiekt Recipe mo e by u yty jako

argument w dowolnym kontrolerze — zostanie wówczas wstrzykni ty dowskazanego kontrolera. Co wi cej, ka dy obiekt Recipe ma wbudowanewymienione poni ej metody:

Recipe.get(),

Recipe.save(),

Recipe.query(),

Recipe.remove(),

Recipe.delete().

Je eli zamierzasz u y metody Recipe.delete() i chcesz zapewnidzia anie aplikacji w przegl darce Internet Explorer, wtedy mu-sisz u y wywo ania w postaci Recipe['delete'](). Wynika toz faktu, e delete jest s owem kluczowym w przegl darce In-ternet Explorer.

Z wymienionych powy ej metod wszystkie poza query() dzia aj z poje-dynczym przepisem kulinarnym. Natomiast warto ci zwrotn metodyquery() jest domy lnie tablica przepisów kulinarnych.

Wiersz kodu deklaruj cy zasób (return $resource) wykonuje równie kilkainnych u ytecznych zada .

1. Zwró uwag na :id w adresie URL wskazanym dla zasobu RESTful.Wspomniany identyfikator oznacza, e w trakcie wykonywania dowol-nego zapytania (na przyk ad za pomoc Recipe.get()), je li przeka eszobiekt wraz z w a ciwo ci id, wówczas jej warto zostanie umiesz-czona na ko cu adresu URL.

Oznacza to, e wywo anie Recipe.get({id: 15}) faktycznie b dzie wy-wo aniem do /recipe/15.

2. Móg by zapyta w tym miejscu: co z drugim obiektem, na przyk ad {id:@id}? Wiersz kodu jest wart tysi ca s ów obja nienia, wi c przejd myod razu do odpowiedniego przyk adu.

Kup książkę Poleć książkę

Page 13: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 107

Przyjmujemy za o enie, e dost pny jest obiekt Recipe zawieraj cywszystkie niezb dne informacje, mi dzy innymi warto id.

Wspomniany obiekt mo na zapisa za pomoc poni szego fragmentukodu:

// Przyj to za o enie, e obiekt existingRecipeObj ma wszystkie niezb dne w a ciwo ci,// w tym id (na przyk ad o warto ci 13).var recipe = new Recipe(existingRecipeObj);recipe.$save();

Przedstawiony kod spowoduje wykonanie dania POST do /recipe/13.

Fragment @id powoduje pobranie warto ci w a ciwo ci id obiektu i u y-cie jej jako parametru id. Takie rozwi zanie przyj to dla wygody — po-zwala ono zaoszcz dzi kilka wierszy kodu.

W pliku apps/scripts/services/services.js istniej jeszcze dwie inne us ugi.Obie zaliczaj si do komponentów wczytuj cych: pierwsza (RecipeLoader)wczytuje pojedynczy przepis, natomiast druga (MultiRecipeLoader) jest prze-znaczona do wczytywania wszystkich przepisów kulinarnych. Wymienio-ne us ugi s u ywane podczas konfiguracji tras, a sposób dzia ania tychus ug jest bardzo podobny i zosta przedstawiony poni ej.

1. Utworzenie obiektu wstrzymanego $q (jest to rodzaj obietnicy frameworkaAngularJS stosowanej w celu czenia funkcji asynchronicznych).

2. Wykonanie wywo ania do serwera.

3. Okre lenie obiektu wstrzymanego, gdy serwer zwraca warto .

4. Zwrot obietnicy, która b dzie u ywana przez mechanizm routingu fra-meworka AngularJS.

Obietnice frameworka AngularJSObietnica to interfejs przeznaczony do pracy z obiektami, które s zwra-cane lub b d wype nione w przysz o ci (w zasadzie s to akcje asyn-chroniczne). Ogólnie rzecz bior c, na obietnic sk ada si obiekt orazfunkcja then().

Aby zobaczy zalety obietnic, spójrzmy na przyk ad, w którym koniecznejest pobranie profilu u ytkownika:var currentProfile = null;var username = 'dowolnaNazwa';fetchServerConfig(function(serverConfig) { fetchUserProfiles(serverConfig.USER_PROFILES, username, function(profiles) { currentProfile = profiles.currentProfile; });});

Kup książkę Poleć książkę

Page 14: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

108 Rozdzia 4. Analiza aplikacji AngularJS

Z powy szym podej ciem zwi zanych jest kilka problemów.

1. Kod wynikowy b dzie koszmarnie powcinany, zw aszcza je li zajdziekonieczno po czenia kilku wywo a .

2. B dy zg aszane mi dzy wywo aniami zwrotnymi i funkcjami majtendencj do znikania, je eli nie zostan r cznie obs u one na ka dymetapie.

3. W wewn trznym wywo aniu zwrotnym konieczna jest hermetyza-cja logiki zwi zanej z dzia aniami przeprowadzanymi za pomoczmiennej currentProfile bezpo rednio lub za pomoc oddzielnejfunkcji.

Obietnica rozwi zuje wymienione problemy. Zanim si przekonasz, w jakisposób, najpierw spójrz na ten sam kod, ale zaimplementowany z u yciemobietnic:var currentProfile = fetchServerConfig().then(function(serverConfig) { return fetchUserProfiles(serverConfig.USER_PROFILES, username);}).then(function(profiles) { return profiles.currentProfile;}, function(error) { // Obs uga b dów powsta ych w fetchServerConfig() // lub w fetchUserProfiles().});

Zwró uwag na zalety nowego rozwi zania.

1. Istnieje mo liwo czenia wywo a funkcji i nie spowoduje tokoszmaru zwi zanego ze stosowaniem wci w kodzie.

2. Masz gwarancj , e wywo anie poprzedniej funkcji zostanie zako -czone, zanim nast pi wywo anie kolejnej funkcji w a cuchu.

3. Ka de wywo anie then() pobiera dwa argumenty (oba to funkcje).Pierwszy to funkcja wywo ywana w przypadku sukcesu operacji,natomiast drugi to procedura obs ugi b dów.

4. W przypadku wyst pienia b dów w a cuchu wspomniany b d b -dzie propagowany przez pozosta e procedury obs ugi b dów. Dla-tego te b d w dowolnym wywo aniu zwrotnym mo na obs u yna ko cu.

Móg by zapyta : co z wywo aniami resolve() i reject()? Wywo aniedeferred() to we frameworku AngularJS sposób tworzenia obietnic. Z koleiwywo anie resolve() powoduje spe nienie obietnicy (i wywo anie pro-cedury obs ugi w przypadku sukcesu operacji), podczas gdy wywo aniereject powoduje wywo anie procedury obs ugi b dów w obietnicy.

Kup książkę Poleć książkę

Page 15: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 109

Do tego zagadnienia powrócimy jeszcze podczas konfiguracji tras.

DyrektywyPrzechodzimy teraz do dwóch dyrektyw, które b d u ywane w tworzo-nej tutaj aplikacji.

butterbar

Ta dyrektywa b dzie pokazana lub ukryta w trakcie wczytywania in-formacji przez stron , a tak e po zmianie trasy. Jest po czona z me-chanizmem zmiany trasy i automatycznie zostaje ukryta lub umiesz-czona w znaczniku na podstawie stanu strony.

focus

Ta dyrektywa jest u ywana w celu zagwarantowania, e pewne polatekstowe (lub elementy) formularza sieciowego s aktywne.

Spójrz na przyk adowy fragment kodu:// Plik: app/scripts/directives/directives.js.var directives = angular.module('guthub.directives', []);

directives.directive('butterbar', ['$rootScope', function($rootScope) { return { link: function(scope, element, attrs) { element.addClass('hide');

$rootScope.$on('$routeChangeStart', function() { element.removeClass('hide'); });

$rootScope.$on('$routeChangeSuccess', function() { element.addClass('hide'); }); } };}]);

directives.directive('focus', function() { return { link: function(scope, element, attrs) { element[0].focus(); } };});

Przedstawiona dyrektywa zwraca obiekt wraz z pojedyncz w a ciwo cilink. Dok adne omówienie tematu tworzenia w asnych dyrektyw znajdzieszw rozdziale 6., teraz musisz jedynie wiedzie o dwóch rzeczach.

Kup książkę Poleć książkę

Page 16: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

110 Rozdzia 4. Analiza aplikacji AngularJS

1. Dyrektywy przechodz przez proces sk adaj cy si z dwóch etapów.Na pierwszym etapie (faza kompilacji) nast puje wyszukanie wszystkichdyrektyw do czonych do elementu drzewa DOM, a nast pnie ichprzetworzenie. Wszelkie operacje na elementach drzewa DOM sprzeprowadzane na etapie kompilacji. Na ko cu fazy otrzymujesz funk-cj cz c .

2. Na drugim etapie (faza czenia — t faz wcze niej wykorzystali my)wygenerowany szablon elementów drzewa DOM jest do czany do za-si gu (scope). Ponadto dodawane s wszelkie komponenty monitoruj celub nas uchuj ce, co oznacza powstanie funkcjonuj cego wi zania mi -dzy zasi giem scope i elementem. Wszystko, co jest powi zane z zasi giemscope, zachodzi na etapie czenia.

Co si dzieje w naszej dyrektywie? Zajrzyjmy do niej i przekonajmy si .

Dyrektywa butterbar mo e by u ywana w nast puj cy sposób:<div butterbar>Komunikat informuj cy o wczytywaniu...</div>

Dzia anie dyrektywy polega na ukryciu elementu oraz dodaniu dwóchkomponentów monitoruj cych zasi g g ówny (scope). Za ka dym razem,gdy rozpoczyna si zmiana trasy, nast puje pokazanie elementu (przezzmian jego klasy), a po zako czonej powodzeniem zmianie trasy mamyponowne ukrycie dyrektywy butterbar.

Interesuj c cech , na któr warto tutaj zwróci uwag , jest sposób wstrzyk-ni cia $rootScope do dyrektywy. Wszystkie dyrektywy maj bezpo redniepowi zanie z systemem wstrzykiwania zale no ci w AngularJS, co pozwalana wstrzykiwanie do nich us ug oraz innych niezb dnych komponentów.

Ostatnia kwestia warta uwagi to API przeznaczone do pracy z elementem.Programi ci przyzwyczajeni do biblioteki jQuery b d szcz liwi, wiedz c,e zastosowanie ma doskonale znana im sk adnia (addClass, removeClass).

Framework AngularJS implementuje pewien podzbiór wywo a jQuery,a wi c biblioteka jQuery stanowi opcjonaln zale no dla ka dego projektuAngularJS. Je eli w projekcie chcesz wykorzysta pe ni mo liwo ci ofe-rowanych przez jQuery, wtedy powiniene wiedzie , e AngularJS u ywajej zamiast wbudowanej implementacji.

Druga dyrektywa (focus) jest znacznie prostsza. Jej dzia anie polega na wywo-aniu metody focus() dla bie cego elementu. Mo na j wywo a przez doda-nie atrybutu focus do dowolnego elementu danych wej ciowych, na przyk ad:

<input type="text" focus></input>

Podczas wczytywania strony element automatycznie jest aktywny.

Kup książkę Poleć książkę

Page 17: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 111

KontroleryPo zaprezentowaniu dyrektyw i us ug mo esz wreszcie przej do kon-trolerów, których w naszej aplikacji mamy pi . Wszystkie zosta y zdefi-niowane w pojedynczym pliku (app/scripts/controllers/controllers.js), ale omó-wimy je tutaj pojedynczo. Przechodzimy wi c do pierwszego kontrolera(ListCtrl), odpowiedzialnego za wy wietlenie listy wszystkich przepisówkulinarnych przechowywanych w systemie.

app.controller('ListCtrl', ['$scope', 'recipes', function($scope, recipes) { $scope.recipes = recipes;}]);

Zwró uwag na jedn bardzo wa n kwesti w przypadku omawianegokontrolera: w konstruktorze nie zawiera on adnego kodu dotycz cegonawi zania po czenia z serwerem i pobrania przepisów kulinarnych.Zamiast tego kod zajmuje si obs ug wcze niej pobranych przepisów. Bymo e zastanawiasz si , jak to zosta o zrobione. Có , dok adn odpowiedpoznasz w sekcji po wi conej routingowi, ale ju teraz mo emy powie-dzie , e wi e si to z us ug MultiRecipeLoader. Po prostu o tym pami taj.

Po zapoznaniu si z kontrolerem ListCtrl zobaczysz, e pozosta e s ca -kiem podobne do omówionego. Mimo wszystko zaprezentujemy je pokolei, wskazuj c przy tym interesuj ce aspekty:

app.controller('ViewCtrl', ['$scope', '$location', 'recipe', function($scope, $location, recipe) { $scope.recipe = recipe;

$scope.edit = function() { $location.path('/edit/' + recipe.id); };}]);

Interesuj cym aspektem kontrolera ViewCtrl jest funkcja edycji udost p-niana obiektowi scope. Zamiast pokazywa i ukrywa pola lub stosowapodobne rozwi zanie, kontroler wykorzystuje framework AngularJS i zlecamu wykonanie najtrudniejszych zada (powiniene stosowa takie samopodej cie!). Funkcja edit() po prostu zmienia adres URL na odpowiednikprzepisu kulinarnego, a AngularJS zajmuje si reszt . Ponadto frameworkwykrywa zmian adresu URL i wczytuje odpowiedni widok (w trybieedycji b dzie to po prostu dany przepis kulinarny). Wspaniale!

Przechodzimy teraz do kontrolera EditCtrl:app.controller('EditCtrl', ['$scope', '$location', 'recipe', function($scope, $location, recipe) { $scope.recipe = recipe;

Kup książkę Poleć książkę

Page 18: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

112 Rozdzia 4. Analiza aplikacji AngularJS

$scope.save = function() { $scope.recipe.$save(function(recipe) { $location.path('/view/' + recipe.id); }); };

$scope.remove = function() { delete $scope.recipe; $location.path('/'); };}]);

W tym kontrolerze nowo ci s metody save() i remove(), które EditCtrludost pnia obiektowi scope.

Metoda save() obiektu scope dzia a zgodnie z oczekiwaniami. Zapisuje bie-cy przepis kulinarny, a po zako czeniu operacji zapisu przekierowuje

u ytkownika do widoku wy wietlaj cego ten sam przepis. Funkcja wywo a-nia zwrotnego jest u yteczna, poniewa pozwala na przeprowadzenie pew-nych operacji po zapisie.

Istniej dwa sposoby zapisania przepisu. Jeden z nich zosta przedstawio-ny w kodzie i polega na wywo aniu funkcji $scope.recipe.$save(). Takierozwi zanie jest mo liwe tylko dlatego, e recipe jest obiektem zasobu zwró-conego przez RecipeLoader.

Natomiast drugi sposób zapisu to wywo anie:Recipe.save(recipe);

Metoda remove() równie nale y do prostych, a jej dzia anie polega nausuni ciu przepisu z obiektu scope oraz przekierowaniu u ytkownika nastron g ówn . Zwró uwag , e nie powoduje to rzeczywistego usuni ciaprzepisu kulinarnego z serwera. Wykonanie dodatkowego wywo ania niepowinno by zbyt trudne.

Kolejny kontroler nosi nazw NewCtrl:app.controller('NewCtrl', ['$scope', '$location', 'Recipe', function($scope, $location, Recipe) { $scope.recipe = new Recipe({ ingredients: [ {} ] });

$scope.save = function() { $scope.recipe.$save(function(recipe) { $location.path('/view/' + recipe.id); }); };}]);

Kup książkę Poleć książkę

Page 19: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 113

Ten kontroler jest niemal dok adnie taki sam jak EditCtrl (jako wiczeniemóg by oba wymienione kontrolery po czy w jeden). Jedyna ró nicapolega na tym, e pierwszym krokiem w dzia aniu kontrolera NewCtrl jestutworzenie nowego przepisu kulinarnego (wspomniany przepis to zasób,a wi c kontroler ma funkcj save()). Ca a pozosta a funkcjonalno nieulega zmianie.

Ostatni kontroler to IngredientsCtrl. Jest to kontroler specjalny, ale zanimprzejdziemy do jego omówienia, spójrz na tworz cy go kod:

app.controller('IngredientsCtrl', ['$scope', function($scope) { $scope.addIngredient = function() { var ingredients = $scope.recipe.ingredients; ingredients[ingredients.length] = {}; }; $scope.removeIngredient = function(index) { $scope.recipe.ingredients.splice(index, 1); };}]);

Wszystkie przedstawione dot d kontrolery s po czone z okre lonymi wi-dokami w interfejsie u ytkownika. Pod tym wzgl dem kontroler Ingredient-sCtrl dzia a nieco inaczej. To po prostu kontroler potomny u ywany doedycji stron i hermetyzacji pewnych funkcji niepotrzebnych na ogólnympoziomie. Warto w tym miejscu wspomnie o pewnej interesuj cej kwestii.Skoro to kontroler potomny, dziedziczy obiekt scope po kontrolerze nad-rz dnym (w omawianym przyk adzie jest to kontroler EditCtrl lub NewCtrl).Dlatego te uzyskanie dost pu do obiektu $scope.recipe odbywa si z po-ziomu kontrolera nadrz dnego.

Sam kod kontrolera nie zawiera nic szczególnie interesuj cego lub unikalnego.Dodaje kilka nowych sk adników do tablicy sk adników przepisu kulinarnegolub te usuwa okre lony sk adnik z listy.

W ten sposób omówili my wszystkie kontrolery. Jedyny fragment koduJavaScript, jaki pozosta do przeanalizowania, dotyczy konfiguracji routingu:

// Plik: app/scripts/controllers/controllers.js.var app = angular.module('guthub', ['guthub.directives', 'guthub.services']);

app.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/', { controller: 'ListCtrl', resolve: { recipes: function(MultiRecipeLoader) { return MultiRecipeLoader(); } },

Kup książkę Poleć książkę

Page 20: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

114 Rozdzia 4. Analiza aplikacji AngularJS

templateUrl:'/views/list.html' }).when('/edit/:recipeId', { controller: 'EditCtrl', resolve: { recipe: function(RecipeLoader) { return RecipeLoader(); } }, templateUrl:'/views/recipeForm.html' }).when('/view/:recipeId', { controller: 'ViewCtrl', resolve: { recipe: function(RecipeLoader) { return RecipeLoader(); } }, templateUrl:'/views/viewRecipe.html' }).when('/new', { controller: 'NewCtrl', templateUrl:'/views/recipeForm.html' }).otherwise({redirectTo:'/'});}]);

Zgodnie z wcze niejsz obietnic docieramy do miejsca, w którym u y-wana jest funkcja resolve(). W poprzednim fragmencie kodu skonfigu-rowano modu guthub AngularJS, a tak e trasy i szablony wykorzystywanew aplikacji.

Kod czy dyrektywy z utworzonymi przez nas us ugami, a nast pniewskazuje ró ne trasy, które b d stosowane w aplikacji.

Dla ka dej trasy definiowany jest adres URL, kontroler odpowiedzialny za ob-s ug danego adresu, wczytywany szablon, a tak e (wreszcie) obiekt resolve.

Obiekt resolve nakazuje frameworkowi AngularJS spe nienie wymagaka dego klucza, zanim trasa b dzie mog a zosta u yta do wy wietleniaodpowiedniego widoku u ytkownikowi. Zadanie aplikacji polega na wczy-taniu wszystkich przepisów kulinarnych (lub tylko wskazanego), a serwerma udzieli odpowiedzi przed wy wietleniem strony u ytkownikowi. Do-stawc tras informujemy wi c o posiadaniu przepisów kulinarnych (lubprzepisu), a nast pnie podajemy mu sposób, w jaki maj by pobrane dane.

W trakcie wykonywania operacji pobierania danych wykorzystywane sdwie us ugi (MultiRecipeLoader i RecipeLoader) zdefiniowane na pocz tkutworzenia aplikacji. Framework AngularJS zosta do sprytnie zaprojek-towany — je eli warto ci zwrotn funkcji resolve() b dzie obietnica An-gularJS, wtedy framework poczeka na spe nienie wspomnianej obietnicyprzed przej ciem dalej. Oznacza to konieczno zaczekania, a serwer udzieliodpowiedzi.

Kup książkę Poleć książkę

Page 21: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 115

Wynik jest w postaci argumentów (o nazwach parametrów b d cych po-lami obiektu) przekazywany konstruktorowi.

Na ko cu funkcja otherwise() wskazuje domy lny adres URL dla przekie-rowania, je li nie nast pi dopasowanie adnej trasy.

By mo e zauwa y e , e kontrolery EditCtrl i NewCtrl korzy-staj z tego samego szablonu, czyli views/recipeForm.html. Co si tutajdzieje? Po prostu ponownie wykorzystali my szablon przezna-czony do edycji przepisu kulinarnego. Szablon wy wietla ró neelementy w zale no ci od wywo anego kontrolera.

Po zako czeniu omawiania kontrolerów mo emy przej do szablonów.Zobaczysz, w jaki sposób wymienione kontrolery zosta y powi zane z sza-blonami, a tak e dowiesz si , jak zarz dza danymi, które s wy wietlaneu ytkownikowi.

SzablonyRozpoczynamy od zapoznania si z najbardziej zewn trznym, g ównymszablonem zdefiniowanym w pliku index.html. Stanowi on podstaw dlanaszej aplikacji sk adaj cej si z pojedynczej strony, a wszystkie pozosta ewidoki s wczytywane w kontek cie omawianego tutaj szablonu:

<!DOCTYPE html><html lang="pl" ng-app="guthub"><head> <title>GutHub - tworzenie przepisów kulinarnych i dzielenie si nimi</title> <script src="scripts/vendor/angular.min.js"></script> <script src="scripts/vendor/angular-resource.min.js"></script> <script src="scripts/directives/directives.js"></script> <script src="scripts/services/services.js"></script> <script src="scripts/controllers/controllers.js"></script> <link href="styles/bootstrap.css" rel="stylesheet"> <link href="styles/guthub.css" rel="stylesheet"></head><body> <header> <h1>GutHub</h1> </header>

<div butterbar>Wczytywanie...</div>

<div class="container-fluid"> <div class="row-fluid"> <div class="span2"> <!-- Pasek boczny. --> <div id="focus"><a href="#/new">Nowy przepis</a></div>

Kup książkę Poleć książkę

Page 22: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

116 Rozdzia 4. Analiza aplikacji AngularJS

<div><a href="#/">Lista przepisów</a></div> </div> <div class="span10"> <div ng-view></div> </div> </div> </div></body></html>

W przedstawionym szablonie istnieje pi elementów, na które warto zwró-ci uwag . Wi kszo z nich mia e okazj pozna w rozdziale 2. Wspo-mniane elementy omówimy po kolei.

ng-app

Ustawienie modu u dla aplikacji GutHub. Jest to dok adnie ten sammodu , który wykorzystali my we funkcji angular.module(). W ten sposóbframework AngularJS wie, jak wszystko ma zosta ze sob po czone.

script znacznik

W tym miejscu nast puje wczytanie AngularJS w aplikacji. Frameworktrzeba wczyta przed wszystkimi plikami JavaScript, które go u ywa-j . W idealnej sytuacji znaczniki odpowiedzialne za wczytywanieskryptów JavaScript powinny znajdowa si na ko cu pliku szablonu.

butterbar

Aha! To pierwsze u ycie naszej w asnej dyrektywy. Ta dyrektywa zo-sta a zdefiniowana wcze niej i chcemy j wykorzysta wraz z elemen-tem wy wietlanym podczas zmiany trasy. Po zako czeniu powodze-niem operacji zmiany trasy element powi zany z dyrektyw butterbarpowinien zosta ukryty. Dyrektywa powoduje wy wietlenie tekstu(w omawianym przypadku jest to nudny komunikat Wczytywanie...), gdyzachodzi potrzeba.

cza href warto ci

To cza href do ró nych stron naszej aplikacji sk adaj cej si z poje-dynczej strony. Zwró uwag na u ycie znaku # gwarantuj cego, estrona nie zostanie ponownie wczytana. Adresy s podawane wzgl -dem strony bie cej. Framework AngularJS monitoruje wspomnianeadresy URL (dopóki strona nie zostanie ponownie wczytana) i wykonujeca prac zwi zan z ich obs ug (w rzeczywisto ci jest to bardzonudne zarz dzanie trasami zdefiniowane przez nas wcze niej wrazz trasami), gdy zachodzi potrzeba.

Kup książkę Poleć książkę

Page 23: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 117

ng-view

W tym miejscu wykonywana jest pozosta a cz pracy. Wcze niej wefragmencie rozdzia u po wi conym kontrolerom zdefiniowali my trasy.Cz ci definicji jest adres URL trasy, powi zany z ni kontroler i sza-blon. Kiedy framework AngularJS wykryje zmian trasy, wtedy na-st puje wczytanie szablonu, do czenie do niego kontrolera oraz za-st pienie elementu ng-view zawarto ci szablonu.

Jedyn rzecz rzucaj c si w oczy jest brak znacznika ng-controller. Wi k-szo aplikacji zawiera pewnego rodzaju kontroler MainController powi zanyz szablonem g ównym. Najcz stszym miejscem jego podania jest znacznik<body>. W omawianej aplikacji nie u ywamy wspomnianego znacznika,poniewa ca y szablon g ówny nie zawiera tre ci AngularJS wymagaj cejodwo ania do obiektu scope.

Spójrzmy teraz na szablony powi zane z poszczególnymi kontrolerami. Napocz tek przygl damy si szablonowi wy wietlaj cemu list przepisówkulinarnych:

<!-- Plik: chapter4/guthub/app/views/list.html. --><h3>Lista przepisów</h3><ul class="recipes"> <li ng-repeat="recipe in recipes"> <div><a ng-href="#/view/{{recipe.id}}">{{recipe.title}}</a></div> </li></ul>

To naprawd bardzo nudny szablon. Znajduj si tutaj jedynie dwa intere-suj ce punkty. Pierwszy to standardowy sposób u ycia znacznika ng-repeat.Zadanie wymienionego znacznika polega na pobraniu wszystkich przepisówz obiektu scope, a nast pnie ich wy wietleniu.

Drugi interesuj cy punkt to u ycie znacznika ng-href zamiast href. Ma tona celu unikni cie wygenerowania nieprawid owego cza podczas wczyty-wania frameworka AngularJS. Znacznik ng-href gwarantuje, e w adnejchwili u ytkownikowi nie zostanie wy wietlony nieprawid owy znacznik.Wymienionego znacznika powiniene u ywa zawsze, gdy adresy URL sdynamiczne, a nie statyczne.

By mo e zadajesz sobie pytanie: gdzie podzia si kontroler? Nie mamyzdefiniowanego znacznika ng-controller i tak naprawd nie ma zdefinio-wanego kontrolera g ównego. W tym miejscu do gry wchodzi mapowanietras. Mo e pami tasz (mówili my o tym kilka stron wcze niej), e trasa /powoduje przekierowanie do wy wietlaj cego list przepisów kulinarnychszablonu, któremu przypisano kontroler ListCtrl. Dlatego te wszelkie od-niesienia do zmiennych pozostaj w zasi gu wymienionego kontrolera.

Kup książkę Poleć książkę

Page 24: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

118 Rozdzia 4. Analiza aplikacji AngularJS

Teraz przechodzimy do znacznie ciekawszego szablonu, czyli odpowiedzial-nego za wy wietlenie przepisu.

<!-- Plik: chapter4/guthub/app/views/viewRecipe.html. --><h2>{{recipe.title}}</h2>

<div>{{recipe.description}}</div>

<h3>Sk adniki</h3>

<span ng-show="recipe.ingredients.length == 0">Brak sk adników</span><ul class="unstyled" ng-hide="recipe.ingredients.length == 0"> <li ng-repeat="ingredient in recipe.ingredients"> <span>{{ingredient.amount}}</span> <span>{{ingredient.amountUnits}}</span> <span>{{ingredient.ingredientName}}</span> </li></ul>

<h3>Sposób przygotowania</h3><div>{{recipe.instructions}}</div>

<form ng-submit="edit()" class="form-horizontal"> <div class="form-actions"> <button class="btn btn-primary">Edycja</button> </div></form>

To kolejny ma y, przydatny szablon. Warto zwróci uwag na dwa punktypowy szego szablonu, cho niekoniecznie w kolejno ci ich wymienienia.

Pierwszy to ca kiem standardowy sposób u ycia dyrektywy ng-repeat.Przepisy kulinarne znajduj si w zasi gu kontrolera ViewCtrl wczytanegoprzez funkcj resolve() przed wy wietleniem strony u ytkownikowi. Dzi kitemu gwarantujemy prawid owe dzia anie strony, gdy zostaje wy wietlona.

Drugi punkt to u ycie dyrektywy ng-submit w formularzu. Wymienionadyrektywa oznacza, e wys anie formularza spowoduje wywo anie funkcjiedit() obiektu scope. Wys anie formularza nast puje, gdy klikni ty b dzieprzycisk niepowi zany z adn funkcj (w omawianym przypadku toprzycisk Edycja). I znów dzia anie frameworka AngularJS zosta o zaprojek-towane bardzo sprytnie — potrafi on prawid owo ustali zasi g, do któregoma si odwo ywa (na przyk ad: modu u, trasy lub kontrolera), i wywo aodpowiedni metod we w a ciwym czasie.

Teraz mo emy przej do ostatniego (i prawdopodobnie najbardziej skom-plikowanego) szablonu, czyli formularza pozwalaj cego na dodanie lub edy-cj przepisu kulinarnego.

Kup książkę Poleć książkę

Page 25: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 119

<!-- Plik: chapter4/guthub/app/views/recipeForm.html. --><h2>Edycja przepisu</h2><form name="recipeForm" ng-submit="save()" class="form-horizontal"> <div class="control-group"> <label class="control-label" for="title">Nazwa:</label> <div class="controls"> <input ng-model="recipe.title" class="input-xlarge" id="title" focus required> </div> </div>

<div class="control-group"> <label class="control-label" for="description">Opis:</label> <div class="controls"> <textarea ng-model="recipe.description" class="input-xlarge" id="description"></textarea> </div> </div>

<div class="control-group"> <label class="control-label" for="ingredients">Sk adniki:</label> <div class="controls"> <ul id="ingredients" class="unstyled" ng-controller="IngredientsCtrl"> <li ng-repeat="ingredient in recipe.ingredients"> <input ng-model="ingredient.amount" class="input-mini"> <input ng-model="ingredient.amountUnits" class="input-small"> <input ng-model="ingredient.ingredientName"> <button type="button" class="btn btn-mini" ng-click="removeIngredient($index)"><i class="icon-minus-sign"></i> Usu </button> </li> <button type="button" class="btn btn-mini" ng-click="addIngredient()"> <i class="icon-plus-sign"></i>Dodaj</button> </ul> </div> </div>

<div class="control-group"> <label class="control-label" for="instructions">Sposóbprzygotowania:</label> <div class="controls"> <textarea ng-model="recipe.instructions" class="input-xxlarge" id="instructions"></textarea> </div> </div>

<div class="form-actions"> <button class="btn btn-primary" ng-disabled="recipeForm.$invalid">Zapisz </button> <button type="button" ng-click="remove()" ng-show="!recipe.id" class="btn"> Usu </button> </div></form>

Kup książkę Poleć książkę

Page 26: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

120 Rozdzia 4. Analiza aplikacji AngularJS

Nie panikuj! Wygl da na to, e szablon zawiera ca kiem spor ilo kodu,i faktycznie tak jest. Jednak po rzeczywistym zag bieniu si we mo nasi przekona , e kod nie jest skomplikowany. Tak naprawd to prosta,powtarzaj ca si struktura, pokazuj ca, jak edytowalne pola tekstowe zo-sta y zastosowane w formularzu przeznaczonym do edycji przepisów ku-linarnych.

W pierwszym polu tekstowym (title) zosta a umieszczona dyrektywafocus. Dzi ki temu po przej ciu na t stron wskazane pole zostaniewybrane, a u ytkownik b dzie móg natychmiast rozpocz wprowa-dzanie danych wej ciowych.

Dyrektywa ng-submit jest u yta w bardzo podobny sposób jak w po-przednim przyk adzie, a wi c nie b dziemy jej tutaj dok adnie oma-wia . Warto wiedzie , e powoduje zapisanie stanu przepisu kulinarne-go i wskazuje koniec procesu edycji. Ponadto jest powi zana z funkcjsave() zdefiniowan w kontrolerze EditCtrl.

Dyrektywa ng-model s u y do po czenia ró nych pól tekstowych for-mularza sieciowego z polami modelu.

Jednym z najbardziej interesuj cych aspektów omawianej strony jestumieszczona w cz ci po wi conej li cie sk adników dyrektywa ng-controller, której naprawd warto po wi ci nieco uwagi i spróbowaw pe ni zrozumie sposób jej dzia ania. Zobaczmy wi c, co si tutajdzieje.

Lista sk adników jest wy wietlana, a zawieraj cy j znacznik jest po-wi zany z dyrektyw ng-controller. Oznacza to, e ca y znacznik <ul>znajduje si w zasi gu kontrolera IngredientsCtrl. Móg by w tymmiejscu zapyta : co z rzeczywistym kontrolerem EditCtrl powi zanymz szablonem? Jak si okazuje, IngredientsCtrl jest tworzony jako kon-troler potomny EditCtrl i tym samym dziedziczy po nim. Dlatego tedost p do obiektu recipe nast puje z poziomu kontrolera EditCtrl.

Ponadto kontroler IngredientsCtrl dodaje metod addIngredient() u y-wan przez dyrektyw ng-click i dost pn jedynie w zasi gu znacz-nika <ul>. Dlaczego zdecydowali my si na takie rozwi zanie? To naj-lepszy sposób na rozdzielenie obowi zków. Po co umieszcza metodaddIngredient() w kontrolerze EditCtrl, skoro 99% szablonu jej nie po-trzebuje? Kontrolery potomne i zagnie d one doskonale sprawdzaj siw tego rodzaju sytuacjach i pozwalaj na oddzielenie logiki biznesowejprzez umieszczenie jej w atwiejszych do zarz dzania elementach.

Kup książkę Poleć książkę

Page 27: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Kontrolery, dyrektywy i us ugi 121

Pozosta e dyrektywy, które chcemy tutaj omówi , s kontrolkami prze-znaczonymi do weryfikacji formularza sieciowego. We frameworkuAngularJS mo na bardzo atwo okre li , e dane pole formularza jestwymagane. W tym celu wystarczy doda do tego pola dyrektyw required(jak to zrobiono w omawianym fragmencie kodu). Rodzi si jednakpytanie: co dalej?

Przechodzimy do przycisku Zapisz. Zwró uwag na u ycie dyrekty-wy ng-disabled, która ma warto recipeForm.$invalid. Cz on pierwszy(recipeForm) to nazwa formularza zawieraj cego deklaracj dyrektywy.Framework AngularJS dodaje do niego pewne zmienne specjalne (za-liczamy do nich $valid i $invalid) pozwalaj ce na kontrolowanie ele-mentów formularza sieciowego. AngularJS wyszukuje wszystkie wy-magane elementy, a nast pnie odpowiednio uaktualnia wspomnianezmienne specjalne. Je eli pole s u ce do podania nazwy przepisu kuli-narnego pozostanie niewype nione, warto ci recipeForm.$invalid b dzietrue (a warto ci $valid b dzie false) i przycisk Zapisz zostanie zablo-kowany.

Istnieje równie mo liwo okre lenia minimalnej i maksymalnej d ugo cipola tekstowego, a tak e wzorzec wyra enia regularnego przeznaczonegodo przeprowadzenia weryfikacji danego pola. Co wi cej, pewne funkcjezaawansowane mo na wykorzysta do wy wietlania komunikatów b dówpo wyst pieniu pewnych okre lonych warunków. Spójrzmy na prostyprzyk ad:

<form name="myForm"> Nazwa u ytkownika:<input type="text" name="userName" ng-model="user.name" ng-minlength="3"> <span class="error" ng-show="myForm.userName.$error.minlength">Zbyt krótka!</span></form>

Za pomoc u ycia dyrektywy ng-minlength w powy szym fragmencie ko-du zdefiniowano, e nazwa u ytkownika musi sk ada si z przynajmniejtrzech znaków. Teraz formularz zostaje wype niony danymi pochodz cymiz obiektu scope — w omawianym przyk adzie to jedynie userName. Wszystkiepola tekstowe maj obiekt $error (zawiera informacje o rodzaju ewentual-nego b du: required, minlength, maxlength lub pattern) oraz w a ciwo$valid wskazuj c poprawno b d te niepoprawno danych wej ciowych.

Kup książkę Poleć książkę

Page 28: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

122 Rozdzia 4. Analiza aplikacji AngularJS

Takie rozwi zanie pozwala na selektywne wy wietlanie u ytkownikowikomunikatu b du w zale no ci od jego rodzaju, jak to pokazano w powy -szym fragmencie kodu.

Do drugiego przycisku do czona jest dyrektywa ng-click u ywana pod-czas usuwania przepisu kulinarnego. Zwró uwag , e przycisk jest wy-wietlany tylko wtedy, gdy przepis nie zosta jeszcze zapisany. Wprawdzie

znacznie sensowniejsze wydaje si u ycie ng-hide="recipe.id", ale czasamibardziej semantyczne rozwi zanie to ng-show="!recipe.id". Oznacza to wy-wietlenie przycisku, gdy przepis kulinarny nie zawiera identyfikatora,

zamiast ukrywania przycisku, je li przepis ma zdefiniowany identyfikator.

TestyWstrzymywali my si z przedstawieniem testów wraz z kontrolerami, alemusia e si spodziewa , e kiedy wreszcie do nich przejdziemy. W tympodrozdziale zaprezentowane zostan testy, które nale y utworzy dlaprzygotowanego dot d fragmentu kodu. Dowiesz si równie , jak tworzysi takie testy.

Testy jednostkoweNajwa niejszy rodzaj testów to testy jednostkowe. Pozwalaj one na spraw-dzenie, czy opracowane kontrolery (dyrektywy i us ugi) maj prawid owstruktur i konstrukcj oraz czy dzia aj zgodnie z oczekiwaniami.

Zanim przejdziemy do poszczególnych testów jednostkowych, warto spoj-rze na szkielet przeznaczony dla wszystkich testów jednostkowych doty-cz cych kontrolera:

describe('Kontrolery', function() { var $scope, ctrl; // W te cie nale y wskaza modu . beforeEach(module('guthub')); beforeEach(function() { this.addMatchers({ toEqualData: function(expected) { return angular.equals(this.actual, expected); } }); });

describe('ListCtrl', function() {....});

// Miejsce na opisanie pozosta ych kontrolerów.});

Kup książkę Poleć książkę

Page 29: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Testy 123

Przygotowany szkielet (tutaj nadal wykorzystujemy styl Jasmine do tworze-nia testów) wykonuje kilka zada .

1. Tworzy globalnie (przynajmniej dla testu) dost pny obiekt scope i kon-troler, a wi c nie trzeba si przejmowa tworzeniem nowej zmiennejdla ka dego kontrolera.

2. Inicjalizuje modu u ywany przez aplikacj (w omawianym przyk adziejest to GutHub).

3. Dodaje specjalne dopasowanie nazywane equalData. Pozwala ono na prze-prowadzanie asercji na obiektach ród a (na przyk ad przepisach kuli-narnych) zwracanych przez us ug $resource lub na wywo anie RESTful.

Pami taj o konieczno ci dodania specjalnego dopasowania na-zywanego equalData za ka dym razem, gdy zachodzi potrzebastosowania asercji na zwróconych obiektach ngResource. Wi esi to z faktem, e zwrócone obiekty ngResource maj metody do-datkowe, których zwyk e wykonanie zako czy si niepowodze-niem, poniewa oczekiwane s wywo ania equalData.

Maj c przygotowany szkielet, spójrzmy na gotowy test jednostkowy prze-znaczony dla kontrolera ListCtrl:

describe('ListCtrl', function() { var mockBackend, recipe; // _$httpBackend_ to nazwa taka sama jak $httpBackend. Zastosowany zapis s u y do odró nienia // zmiennych wstrzykni tych od zmiennych lokalnych. beforeEach(inject(function($rootScope, $controller, _$httpBackend_, Recipe) { recipe = Recipe; mockBackend = _$httpBackend_; $scope = $rootScope.$new(); ctrl = $controller('ListCtrl', { $scope: $scope, recipes: [1, 2, 3] }); }));

it('Wynikiem powinna by lista przepisów kulinarnych', function() { expect($scope.recipes).toEqual([1, 2, 3]); });});

Jak zapewne pami tasz, kontroler ListCtrl nale y do najprostszych w apli-kacji. Konstruktor kontrolera pobiera po prostu list przepisów, a nast p-nie zapisuje je w obiekcie. Wprawdzie mo na do tego utworzy test, alewydaje si to zb dne. W omawianym przyk adzie mimo wszystko utwo-rzyli my test, poniewa testy jednostkowe s wspania e!

Kup książkę Poleć książkę

Page 30: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

124 Rozdzia 4. Analiza aplikacji AngularJS

Znacznie ciekawiej robi si w przypadku us ugi MultiRecipeLoader. Wy-mieniona us uga jest odpowiedzialna za pobranie listy przepisów kulinar-nych z serwera i przekazanie ich jako argumentu (kiedy zastosowana jestprawid owa konfiguracja za pomoc us ugi $route):

describe('MultiRecipeLoader', function() { var mockBackend, recipe, loader; // _$httpBackend_ to nazwa taka sama jak $httpBackend. Zastosowany zapis s u y do odró nienia // zmiennych wstrzykni tych od zmiennych lokalnych. beforeEach(inject(function(_$httpBackend_, Recipe, MultiRecipeLoader) { recipe = Recipe; mockBackend = _$httpBackend_; loader = MultiRecipeLoader; }));

it('Wynikiem powinno by wczytanie listy przepisów kulinarnych', function() { mockBackend.expectGET('/recipes').respond([{id: 1}, {id: 2}]);

var recipes;

var promise = loader(); promise.then(function(rec) { recipes = rec; });

expect(recipes).toBeUndefined(); mockBackend.flush(); expect(recipes).toEqualData([{id: 1}, {id: 2}]); });});// Miejsce na opisanie pozosta ych kontrolerów.

Test us ugi MultiRecipeLoader odbywa si przez przygotowanie us ugi HttpBackend w naszym te cie. Obiekt pochodzi z pliku angular-mocks.js i jest

do czany w trakcie przeprowadzania testów. Po prostu wstrzykni cie godo metody beforeEach() jest wystarczaj ce, aby mo na by o konfigurowaoczekiwania. W drugim, znacznie ciekawszym te cie oczekiwanie zosta ozdefiniowane jako wywo anie server GET do recipes, a wynikiem powinnaby tablica obiektów. Nast pnie u ywamy dopasowania w celu spraw-dzenia, czy uzyskany wynik jest dok adnie zgodny z oczekiwaniami. Zwróuwag na wywo anie flush() w obiekcie makiety, przekazuj ce odpowiedpochodz c z serwera. Tego rodzaju mechanizm mo na wykorzysta doprzetestowania przep ywu kontroli i sprawdzenia, jak aplikacja dzia a przedotrzymaniem odpowiedzi z serwera i po jej otrzymaniu.

Pomijamy kontroler ViewCtrl, poniewa jest niemal identyczny z ListCtrl,poza dodatkiem w postaci metody edit(). Wymieniona metoda jest bardzoatwa do przetestowania: wystarczy wstrzykn us ug $location do testu

i sprawdzi jej warto .

Kup książkę Poleć książkę

Page 31: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Testy 125

Przechodzimy teraz do kontrolera EditCtrl, który z perspektywy testówjednostkowych ma dwa interesuj ce punkty. Funkcja resolve() jest podobnado u ywanej ju poprzednio i mo e by przetestowana w dok adnie tensam sposób jak wcze niej w rozdziale. Zamiast tego zobaczysz teraz, jakmo na przetestowa metody save() i remove(). Spójrzmy wi c na wymienionetesty (przyj to za o enie o u yciu szkieletu przedstawionego w poprzednimprzyk adzie):

describe('EditCtrl', function() { var mockBackend, location; beforeEach(inject(function($rootScope, $controller, _$httpBackend_, $location, Recipe) { mockBackend = _$httpBackend_; location = $location; $scope = $rootScope.$new();

ctrl = $controller('EditCtrl', { $scope: $scope, $location: $location, recipe: new Recipe({id: 1, title: 'Przepis'}) }); }));

it('Wynikiem powinien by zapisany przepis kulinarny', function() { mockBackend.expectPOST('/recipes/1', {id: 1, title: 'Przepis'}).respond({id: 2});

// Ustawienie innej warto ci, aby mie gwarancj jej zmiany podczas testu. location.path('test');

$scope.save(); expect(location.path()).toEqual('/test');

mockBackend.flush();

expect(location.path()).toEqual('/view/2'); });

it('Wynikiem powinno by usuni cie przepisu kulinarnego', function() { expect($scope.recipe).toBeTruthy(); location.path('test');

$scope.remove();

expect($scope.recipe).toBeUndefined(); expect(location.path()).toEqual('/'); });});

Kup książkę Poleć książkę

Page 32: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

126 Rozdzia 4. Analiza aplikacji AngularJS

W pierwszym te cie sprawdzane jest dzia anie funkcji save(). W szczegól-no ci upewniamy si , e operacja zapisu powoduje wykonanie do serwera

dania POST wraz z obiektem. Nast pnie, po udzieleniu odpowiedzi przezserwer, przechodzimy na stron zawieraj c nowo zapisany przepis kulinarny.

Drugi test jest jeszcze prostszy. Po prostu sprawdzamy, czy wywo aniefunkcji remove() powoduje usuni cie wskazanego przepisu kulinarnego,a nast pnie przekierowujemy u ytkownika na stron docelow . Jest to atwedo wykonania dzi ki wstrzykni ciu us ugi $location do testu i jej u yciu.

Pozosta a cz testów jednostkowych dla kontrolerów wykorzystuje te samewzorce, a wi c mo na je tutaj pomin . Ogólnie rzecz ujmuj c, testy jed-nostkowe opieraj si na kilku aspektach:

zagwarantowanie, e kontroler (lub bardziej prawdopodobnie obiektscope) osi gnie prawid owy stan na ko cu procesu inicjalizacji;

potwierdzenie wykonania prawid owych wywo a serwera i osi gni ciew a ciwego stanu przez obiekt scope w trakcie wspomnianych wywo-a serwera oraz po ich zako czeniu (do tego celu w testach jednost-

kowych u ywany jest obiekt makiety);

wykorzystanie funkcji wstrzykiwania zale no ci we frameworku An-gularJS, aby uzyska uchwyt do elementów i obiektów u ywanych przezkontroler. Pozwala to upewni si , e kontroler ustawia prawid owy stan.

Testy scenariuszyGdy testy jednostkowe zako cz si powodzeniem, mo e pojawi si po-kusa zako czenia pracy. Jednak praca programisty AngularJS nie ko czysi , zanim nie b d przeprowadzone testy scenariuszy. Wprawdzie testyjednostkowe daj gwarancj , e ka dy najmniejszy fragment kodu Java-Script dzia a zgodnie z oczekiwaniami, ale jednocze nie warto si upewnio wczytaniu szablonów, prawid owym powi zaniu kontrolerów i poprawnejreakcji na klikni cia elementów szablonu.

Dok adnie do tego celu s u testy scenariuszy we frameworku AngularJS.Pozwalaj one na:

wczytanie aplikacji;

przej cie na konkretn stron ;

klikni cie i wprowadzenie tekstu;

upewnienie si o prawid owej reakcji aplikacji.

Kup książkę Poleć książkę

Page 33: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Testy 127

Na jakiej zasadzie dzia a test scenariusza dla strony wy wietlaj cej listprzepisów kulinarnych? Przede wszystkim przed rozpocz ciem rzeczywi-stego testu trzeba poczyni pewne przygotowania.

Aby ten test scenariusza dzia a , konieczne jest przygotowanie serweraWWW, który b dzie mia mo liwo akceptacji da wykonywanychprzez aplikacj GutHub, a tak e pobierania listy przepisów kulinarnychz testowanej aplikacji oraz ich przechowywania. Mo esz zmodyfikowa kodi wykorzysta zapisywan w pami ci list przepisów — wymaga to usu-ni cia $resource dla przepisu i zmiany us ugi na obiekt zawieraj cy danew formacie JSON. Ewentualnie mo na ponownie wykorzysta i zmodyfiko-wa serwer WWW przedstawiony w poprzednim rozdziale b d te u ynarz dzia Yeoman!

Po przygotowaniu i uruchomieniu serwera WWW obs uguj cego aplikacjwystarczy utworzy i wykona przedstawiony poni ej test:

describe('GutHub App', function() { it('Wynikiem powinna by lista przepisów kulinarnych', function() { browser().navigateTo('/index.html'); // Domy lna lista przepisów kulinarnych w aplikacji GutHub sk ada si jedynie z dwóch pozycji. expect(repeater('.recipes li').count()).toEqual(2); });});

Kup książkę Poleć książkę

Page 34: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

128 Rozdzia 4. Analiza aplikacji AngularJS

Kup książkę Poleć książkę

Page 35: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

217

Skorowidz

Aanaliza aplikacji, 101anatomia aplikacji, 23API, 150API HTML5, 174API jQuery, 165aplikacje

AJAX, 57mobilne, 61sieciowe, 11

architektura MVC, 14, 24arkusze stylów CSS, 39asynchroniczne wywo ania metod, 130atak typu XSRF, 147atrybut

href, 42multiple, 203ng-app, 19ng-change, 30ng-controller, 44ng-model, 20, 45, 193ng-repeat, 19, 37required, 66src, 42

Bbezpiecze stwo, 146biblioteka

jQuery, 110NodeJS, 76RequireJS, 92Socket.IO, 76, 129, 204

blokConfig, 179Run, 179

b dy, 173buforowanie odpowiedzi, 134

Cciasteczka, 184

Ddane wej ciowe, 65debugowanie, 85definiowanie kontrolerów, 111deklaracja

dyrektywy, 201kontrolera, 194zasobu, 140

dodawanie trasy, 90do czanie danych, 14, 20, 27DOM, Document Object Model, 14, 63, 164dost p do

konsoli, 87zasi gu, 160

dwukropek, 140dyrektywa, 17, 149

butterbar, 109, 116, 211errorMessage, 212expander, 167focus, 65, 95, 109ng-app, 24ng-bind, 29ng-bind-html, 189ng-bind-html-unsafe, 189ngbkFocus, 65ng-class, 40ng-click, 65, 122ng-controller, 120ng-disabled, 67ng-hide, 38ng-minlength, 121ng-model, 120ngPluralize, 186ng-repeat, 37, 41, 118, 196, 200

Kup książkę Poleć książkę

Page 36: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

218 Skorowidz

dyrektywang-style., 40ng-submit, 32, 118, 120ng-view, 58

dyrektywydost p do zasi gu, 160funkcja compile(), 157funkcja link(), 157nazwa, 152obs uga zdarze , 32opcja priority, 153opcja templates, 154opcja transclude, 157w a ciwo restrict, 152

dyskretny kod JavaScript, 33dzia anie

dyrektywy, 110filtru, 57funkcji save(), 126opcji dyrektywy, 164testu, 99us ugi $location, 174

Eedycja przepisu, 118element

<input>, 66ng-app, 116ng-href, 117ng-repeat, 117ng-show, 38ng-view, 117

elementydrzewa DOM, 36, 164powtarzalne, 36szablonu, 116tablicy, 42

Ffaza

kompilacji, 158czenia, 158

filtr, 55filterService, 200linky, 189, 190

filtrowanie, 196daty i godziny, 188listy, 80

formatowanie danych, 55formularz, 29formularz rejestracyjny, 65framework

BDD, 79Express, 75

funkcja$http.get(), 130$resource, 140$scope. safeApply(), 173$watch(), 30, 45–50addExpander(), 168callback, 208callMe(), 50compile(), 158computeNeeded(), 31controller(), 165directive(), 63done, 203edit(), 118equals(), 143factory(), 53, 181focus(), 64, 110inheritedData(), 165injector(), 165link(), 64, 158otherwise(), 58, 115provider(), 53, 181remove(), 21, 112resolve(), 114, 118, 125run(), 156save(), 112scope(), 165select(), 194selectRow(), 41service(), 53, 181StartUpController(), 31stun(), 39then(), 107, 143totalCart(), 47

funkcjejQuery, 165typu getter, 175typu setter, 175us ugi $location, 174

Kup książkę Poleć książkę

Page 37: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Skorowidz 219

Ggranice aplikacji, 24grupowanie zale no ci, 51

Hharmonijka, 168hermetyzacja, 142

IIDE, 73identyfikator lokalizacji, 186informacje o lokalizacji, 173instalacja

Karma, 96Yeoman, 89

integracja z IDE, 79interceptor, 212interfejs

document.cookie, 184u ytkownika, 19

internacjonalizacja aplikacji, 185, 188

Kkarta

kredytowa, 139Model, 86Performance, 86

katalogapp, 93config, 93test, 93

klasa HelloController, 13kod

lokalizacji, 186serwera, 75us ugi, 105

kompilacja, 82kompilator Closure Compiler, 83komponent nas uchuj cy, 183komunikacja

mi dzy kontrolerami, 196mi dzy zasi gami, 182z serwerami, 61, 129z us ugami, 211

konfiguracjamodu u, 180routingu, 113rodowiska programistycznego, 92

testów jednostkowych, 96zasi gu, 161

dania, 131konstruktor kontrolera, 167kontroler, 14, 25, 43, 103, 166

CartController, 21, 47EditCtrl, 111, 120, 125FilterCtrl, 196HelloController, 13IngredientsCtrl, 113ListCtrl, 111, 117, 123, 196NamesListCtrl, 136NewCtrl, 112RootController, 212SearchController, 185ViewCtrl, 111

kontrolka datepicker, 191, 194koszyk na zakupy, 18, 48

Llista, 36logika

aplikacji, 14, 65biznesowa, 142

lokalizacja, 185, 186luka w zabezpieczeniach, 146

czabezwzgl dne, 177href, 116wzgl dne, 177

Mmened er NPM, 77metoda, Patrz funkcjametody

konfiguracji modu u, 180modu u AngularJS, 178obiektu Recipe, 106obiektu zdarzenia, 184

Kup książkę Poleć książkę

Page 38: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

220 Skorowidz

model, 14, 25, 102modu

g ówny, 179guthub, 114ngResource, 138ngSanitize, 189Sanitize, 188

modyfikacjaciasteczka, 148

dania, 132monitorowanie

elementów, 50zmian, 45

MVC, 14, 24

Nnag ówek

Authorization, 213DO NOT TRACK, 133

nag ówkiHTTP, 133uwierzytelnienia, 211

narz dzia, 73, 84narz dzie

Ant, 92Batarang, 85

karta Model, 86karta Performance, 86w a ciwo ci elementów, 87zale no ci us ugi, 87

Karma, 76–78, 96RequireJS, 92Scenario Runner, 80, 82WebStorm, 73Yeoman, 70, 75

dodawanie tras, 90funkcje, 88instalacja, 89testy, 91tworzenie projektu, 90

nas uchiwanie zdarze , 183nawias klamrowy, 28nazwa dyrektywy, 152ngResource, 142notacja

{{ }}, 20interpolacji, 39

NPM, Node Package Manager, 77

Oobiekt

$scope, 44config, 131, 135Recipe, 106resolve, 114scope, 136zdarzenia, 184

obiektowy model dokumentu, 14obiekty wstrzymane, 107obietnica, 107, 143obs uga

b dów, 145, 210HTML5, 63kodów stanu, 212liczby mnogiej, 186lokalizacji, 187

czy, 176przekierowa , 211RequireJS, 96zdarze , 32, 33

ochrona przed luk , 147oczyszczanie kodu HTML, 188opakowanie kontrolki jQuery, 191opcje

dyrektywy, 151w a ciwo ci require, 167

operacjebitowe, 42logiczne, 42matematyczne, 42po stronie serwera, 142

optymalizacja, 83Simple, 83zaawansowana, 83

organizacja projektu, 70, 92

Ppasek

nawigacyjny, 35tytu u, 162

plikangular.js, 187app.js, 94controller.js, 60controllers.js, 64, 95

Kup książkę Poleć książkę

Page 39: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Skorowidz 221

detail.html, 59index.html, 58, 64, 95karma.config.js, 78list.html, 59main.js, 95, 98

plikiaplikacji, 70JavaScript, 70konfiguracyjne, 72, 78szablonów HTML, 71

pokazywanie elementów, 38pole

combo, 200tekstowe, 29, 120wyboru, 200wyszukiwania, 199

porównania, 42prawo Demeter, 17produkty, 55programowanie, 69projekt jQuery-File-Upload, 201prototypowe dziedziczenie, 26przechwycenie odpowiedzi, 145przedstawianie danych, 14przekazywanie plików, 201przenoszenie tre ci, 157przepisy kulinarne, 102przepisywanie czy, 177przycisk zerowania, 32publikacja danych modelu, 44

SScenario Runner, 80, 82schematy weryfikacji HTML, 150serwer

Karma, 78RESTful, 106Socket.IO, 206WWW, 75, 90

serwis GitHub, 62strategie wi zania, 161strefy czasowe, 188stronicowanie, 207styl Jasmine, 80, 123style CSS, 39szablon, 15, 17, 27, 54, 103szablon po stronie klienta, 12

cie ki app/img, 71rodowisko IDE, 73, 79

Ttabela, 36tablica currentPageItems, 209TDD, Test-driven development, 76technika TDD, 76, 80test, 99

ACID, 35integracji, 72, 80jednostkowy, 72, 79, 122, 135, 142kontrolera, 136metody, 125scenariusza, 126, 127typu E2E, 72, 80, 99us ugi, 124, 208

testowanie, 76token, 148transformacje

odpowiedzi, 134dania, 134

trasa, 44, 57, 114tryb

hashbang, 175HTML5, 175

tworzenieaplikacji sieciowych, 11dyrektyw, 109, 150filtrów, 56funkcji dyrektywy, 63interfejsu u ytkownika, 14obiektu wstrzymanego, 107obietnic, 108paska, 162projektu, 90, 91szablonu, 12, 115trasy, 57us ug, 53zasi gu, 160

typ zasi gu, 161

Kup książkę Poleć książkę

Page 40: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

222 Skorowidz

Uuaktualnianie listy, 196ukrywanie

b dów, 212elementów, 38

uruchamianieaplikacji, 28, 75serwera, 90testów, 91

r czne, 81zautomatyzowane, 81

us uga, 53, 105$cookies, 185$cookieStore, 185$http, 61, 129, 137, 142$httpProvider, 135$location, 17, 57, 124, 171

funkcje, 174integracja AngularJS, 173integracja HTML5, 174tryb hashbang, 175tryb HTML5, 175

$q, 143$route, 57, 124$routeProvider, 57Authentication, 213, 214Error, 211errorService, 211filterService, 196MultiRecipeLoader, 124Pagination, 210Paginator, 208stronicowania, 207

uwierzytelnienie dania, 213u ycie

atrybutu ng-model, 45biblioteki Socket.IO, 204dyrektywy, 153dyrektywy focus, 65filtrów, 196funkcji $watch(), 45, 48kontrolerów, 43, 166Pythona, 76Scenario Runner, 82serwera WWW, 75, 81transformacji, 135us ugi $location, 174

WebStorm, 74wyra enia, 45Yeoman, 75zasobów AngularJS, 138

Wwczytywanie

modu u, 179skryptu, 23

weryfikacjadanych wej ciowych, 65kodu HTML, 149pól formularza, 66

wi zanie select, 193widok, 14, 25, 44wielokrotne

u ycie kodu, 170u ycie komponentów, 170

w a ciwo ciAngularJS, 89elementów, 87obiektu, 42obiektu zdarzenia, 184

w a ciwo$scope.isDisabled, 40$valid, 66innerHtml, 15require, 167window.location, 171, 173

wskazanieatrybutu select, 195lokalizacji, 57

wstrzykiwanieus ugi, 96zale no ci, 16, 126

wtyczkaBatarang, 85FileUpload, 203

wydajno aplikacji, 83wykonywanie testów, 98wyra enia, 42wy wietlanie

listy, 196tekstu, 28, 118

wywo aniaAPI, 180zwrotne, 141

Kup książkę Poleć książkę

Page 41: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

Skorowidz 223

wywo anie$apply, 172AngularJS, 23factory(), 180provider(), 181scope.$apply, 172select(), 194service(), 181

wyzerowanie warto ci pola tekstowego, 32wzorzec Singleton, 183

XXHR, 130XSRF, 147

Zzabezpieczenia JSON, 146zagnie d enie zasi gów, 86zale no ci, 51, 71, 179

RequireJS, 94us ugi, 87

zarz dzaniedanymi, 14modu ami, 179zale no ciami, 92

zasada minimalnej wiedzy, 17zasi g, 44, 86, 160, 182

globalny, 26g ówny $rootScope, 182nadrz dny, 161, 183odizolowany, 160potomny, 161, 183

zasobyAngularJS, 138RESTful, 106, 137statyczne, 71

zasób karty kredytowej, 139zdarzenia zasi gu, 183zdarzenie

click, 166loginRequired, 211on-select, 194select, 195

zintegrowane rodowiskoprogramistyczne, IDE, 73

zlokalizowany zestaw regu , 187zmiana

elementów drzewa DOM, 63widoków, 57

znacznik, Patrz elementznacznik semantyczny, 34znak

dolara, 53dwukropka, 140

danie, 131CreditCard, 139DELETE, 138GET, 138POST, 107, 138XHR, 130

ywe szablony, 74

Kup książkę Poleć książkę

Page 42: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale

O autorachBrad Green pracowa nad projektem AngularJS jako mened er in ynierów w Google,gdzie jest odpowiedzialny równie za kwestie zwi zane z u atwieniami dost pu i pomoctechniczn . Przed podj ciem pracy w Google zajmowa si tworzeniem witryn interne-towych dla urz dze przeno nych w AvantGo, zak ada i sprzedawa start-upy, a kilkalat sp dzi na mozolnej pracy osoby organizuj cej przyj cia i bankiety. Wkrótce pouko czeniu szko y podj sw pierwsz prac w za o onej przez Steve’a Jobsa firmieNeXT Computer, w której odpowiada za przygotowywanie wersji demo oprogramowa-nia i slajdów do prezentacji Jobsa. Brad wraz z on i dwójk dzieci mieszka w MountainView w stanie Kalifornia.

Shyam Seshadri jest w a cicielem i szefem Fundoo Solutions (http://www. befundoo.com/),gdzie czas dzieli mi dzy prac nad innowacyjnymi i ekscytuj cymi nowymi produktamina rynek indyjski a wiadczeniem us ug konsultingowych i prowadzeniem warsztatówdotycz cych AngularJS. Przed utworzeniem Fundoo Solutions zdoby tytu magistra napresti owej indyjskiej uczelni Indian School of Business w Hajdarabadzie. Po uko cze-niu szko y pracowa dla Google, gdzie zajmowa si ró norodnymi projektami, mi dzyinnymi Google Feedback (pierwsza aplikacja oparta na frameworku AngularJS!), orazinnymi narz dziami i projektami wewn trznymi. Obecnie pracuje w swoim biurze w NawiMumbaj w Indiach.

KolofonZwierz widniej ce na ok adce ksi ki AngularJS to Lactoria fornasini — morska ryba roz-dymkokszta tna nale ca do rodziny kosterowatych (Ostraciidae) i rodzaju Lactoria. yje naskalistych rafach lub piaszczystym dnie, schowana i zapl tana pomi dzy g bkami orazwodorostami. Wyst puje w zachodniej cz ci oceanów Spokojnego i Indyjskiego. ywisi g ównie robakami i innymi bezkr gowcami.

Lactoria osi ga 15 centymetrów d ugo ci i od 3 do 50 centymetrów szeroko ci. Osobniki za-liczane do rodziny kosterowatych wyró niaj si sze ciok tnym wzorem p ytek kost-nych tworz cych pancerz na ich skórze. Z cia a, przypominaj cego trójk tne pude ko,wystaj p etwy i ogon umo liwiaj ce im poruszanie si . Wraz z wiekiem kszta t cia a koste-rowatych zmienia si od nieco zaokr glonego do kwadratowego, a kolor skóry staje sibardziej jaskrawy.

Lactoria fornasini chroni si przed niebezpiecze stwem, wydzielaj c przez skór substan-cje powierzchniowo czynne uruchamiane pod wp ywem stresu. Toksyny, zwykle wydalanew postaci luzu, przenikaj do rodowiska, dra ni c inne ryby i organizmy znajduj ce siw niedalekim s siedztwie.

Rysunek na ok adce pochodzi ze zbiorów Johnson’s Natural History. Czcionka na ok adceto Adobe ITC Garamond. Czcionka tekstu to Adobe Minion Pro, czcionka w nag ów-kach — Adobe Myriad Condensed, kody zosta y napisane czcionk Dalton Maag’sUbuntu Mono.

Kup książkę Poleć książkę

asedzielewski
Prostokąt
Page 44: Tytuł oryginału: AngularJS101 ROZDZIA $ 4. Analiza aplikacji AngularJS W rozdziale 2. przedstawiono pewne najczö ciej u ywane funkcje framewor-ka AngularJS, natomiast w rozdziale