SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
AngularJS
Podstawy
Wojciech Panek - Tech Lead, Apptension
www.apptension.com
https://bitbucket.org/WojtekPanek/akaicountries
Cechy AngularJS
• Framework MVC/MVVM
• Dodatkowe atrybuty HTML
• Modele w postaci POJO (Plain Old Javascript
Object)
• Zestaw komponentów ułatwiających organizację
projektu
• Two-way Data Binding
• Dirty Checking
• Zbudowany z wykorzystaniem jQuery
• Duża popularność i wsparcie społeczności
Komponenty
Komponenty - Module
• Pozwala na grupowanie
• Zarządzanie Dependency Injection
• Konfiguracja
Komponenty - Module
var application = angular.module('countriesApp', [
'ui.router'
]);
application.config(['$locationProvider', '$stateProvider', '$urlRouterProvider',
function($locationProvider, $stateProvider, $urlRouterProvider){
$locationProvider.hashPrefix('');
$stateProvider.state('countryList', {
url: "/",
templateUrl: "app/view/country-list.html"
});
$stateProvider.state('countryView', {
url: "/:name",
templateUrl: "app/view/country-view.html"
});
$urlRouterProvider.otherwise('/');
}]);
Komponenty - Module
<html data-ng-app="countriesApp">
<head lang="en">
<meta charset="UTF-8">
<title>AKAI Countries</title>
</head>
<body>
<div data-ui-view></div>
</body>
</html>
Komponenty - Controller
• Dostarcza dane widokom ($scope)
• Zawiera logikę widoków
• Nie powinien manipulować drzewem DOM
• Przypisywany widokom przy pomocy atrybutu
HTML ng-controller
Komponenty - Controller
application.controller('countryListController', ['$scope', 'countryService',
function($scope, countryService){
$scope.countries = [];
$scope.loadingCountries = true;
$scope.countryModel = {
name: "",
symbol: ""
};
countryService.getList().then(function(list){
$scope.countries = list;
$scope.loadingCountries = false;
});
$scope.addCountry = function() {
$scope.countries.push($scope.countryModel);
$scope.countryModel = {
name: "",
symbol: ""
}
}
}]);
Komponenty - View
• Zapisywany w języku HTML rozszerzonym o dodatkowe
atrybuty
• Ma dostęp do wszystkich elementów $scope
• Dodatkowe atrybuty:
– ng-if
– ng-show/ng-hide
– ng-click
– ng-repeat
– ng-model
– ng-class
– ng-style
– ng-src
– ng-attr-{{ }}
Komponenty - View
<div data-ng-controller="countryListController">
<data-loader data-is-loading="loadingCountries">
<div>
<label for="country-name">Name:</label>
<input type="text" data-ng-model="countryModel.name" name="CountryName"
id="country-name" />
</div>
<div>
<label for="country-symbol">Symbol:</label>
<input type="text" data-ng-model="countryModel.symbol" name="
CountrySymbol" id="country-symbol" />
</div>
<div>
<button data-ng-click="addCountry()">Add</button>
</div>
<hr>
<div data-ng-repeat="country in countries track by $index">
<span> {{ country.name }} </span>
<span> {{ country.symbol | countryCode }} </span>
<a data-ui-sref="countryView({ name: country.name })"> view </a>
</div>
</data-loader>
</div>
Komponenty - Service
• Oparty o wzorzec projektowy Singleton
• Może zostać wstrzyknięty w dowolne miejsce aplikacji przy
pomocy Dependency Injection
• Często wykorzystywany do implementacji warstwy pobierającej
dane
• Może zostać wykorzystany do implementacji warstwy Modeli
• Predefiniowane serwisy:
– $http
– $window
– $q
Komponenty - Service
application.service('countryService', ['$http', '$q', function ($http, $q) {
this.getList = function () {
var deferred = $q.defer();
$http.get('https://restcountries.eu/rest/v1/all').success(function (data) {
var result = [];
for (var i = 0; i < data.length; i++) {
result.push({
name: data[i].name,
symbol: data[i].alpha2Code
});
}
deferred.resolve(result);
});
return deferred.promise;
};
}]);
Komponenty - Factory
• Działanie i zastosowanie identyczne jak Service
• Zwraca wynik funkcji zamiast instancji funkcji
Komponenty - Factory
application.factory('countryFactory', ['$http', '$q',
function ($http, $q) {
return {
getList: function() {
var deferred = $q.defer();
$http.get('https://restcountries.eu/rest/v1/all').success(function
(data) {
var result = [];
for (var i = 0; i < data.length; i++) {
result.push({
name: data[i].name,
symbol: data[i].alpha2Code
});
}
deferred.resolve(result);
});
return deferred.promise;
}
};
}]);
Komponenty - Directive
• Komponent interfejsu użytkownika przeznaczony do
wielokrotnego użytku
• Nie powinien zawierać logiki biznesowej
• Może manipulować drzewem DOM
• Można do niego przekazać parametry:
– =
– @
– &
• Często używany do inicjalizacji bibliotek jQuery
• Częsty powód wycieków pamięci
Komponenty - Directive
application.directive('loader', [
function(){
return {
restrict: 'AE',
replace: true,
transclude: true,
templateUrl: 'app/directive/loader/loader.html',
scope: {
isLoading: '='
},
link: function($scope, element) {
var scale = 10;
var negative = true;
$scope.animation = setInterval(function(){
angular.element(element).find(".loader").css('transform', 'scale(' +
scale/10 + ')');
if(negative) scale -= 1; else scale += 1;
if(scale == 0 || scale == 10) negative = !negative;
}, 50);
$scope.$on('$destroy', function() {
clearInterval($scope.animation);
});
}
}
}
]);
Komponenty - Filter
• Pozwala na manipulację danymi wejściowymi
• Nie powinien zawierać logiki biznesowej
• Domyślnie dostępny w widokach
• Pozwala na przetwarzanie strumieniowe przy pomocy operatora |
• Predefiniowane filtry:
– orderBy
– filter
– date
– currency
Komponenty - Filter
application.filter('countryCode', function() {
return function(input) {
return '[' + input + ']'
};
});
Zagrożenia i Problemy
Zagrożenia i Problemy
• Nauka AngularJS nie jest prosta
• Skalowalność i wydajność aplikacji
• Czytelność struktury projektu
• Wycieki pamięci
• Ograniczone narzędzia do pisania testów (Protractor)
• Pokusa używania jQuery
• SEO
• AngularJS 2.0
Biblioteki
Biblioteki
• ui-router
• angular-bootstrap/angular-foundation
• angular-ui
• angular-translate
• ngResource
Narzędzia
Dziękuję za uwagę

Contenu connexe

En vedette

Decorex Durban 2017 in pictures
Decorex Durban 2017 in picturesDecorex Durban 2017 in pictures
Decorex Durban 2017 in picturesFred Felton
 
Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...
Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...
Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...Péter Tóth-Czere
 
Propuestas de resolución 2017
Propuestas de resolución 2017Propuestas de resolución 2017
Propuestas de resolución 2017Nueva Canarias-BC
 
New Declassified Report Exposes Hamas Human Shield Policy
New Declassified Report Exposes Hamas Human Shield PolicyNew Declassified Report Exposes Hamas Human Shield Policy
New Declassified Report Exposes Hamas Human Shield PolicyIsraelDefenseForces
 
Perché le aziende devono essere presenti su internet
Perché le aziende devono essere presenti su internetPerché le aziende devono essere presenti su internet
Perché le aziende devono essere presenti su internetClientecontento
 
Sportcongres noord nederland Jaap van Zessen
Sportcongres noord nederland Jaap van ZessenSportcongres noord nederland Jaap van Zessen
Sportcongres noord nederland Jaap van ZessenJaap van Zessen
 
Webinar - Introducción a la ISO/IEC 29110-4-1:2011
Webinar - Introducción a la ISO/IEC 29110-4-1:2011Webinar - Introducción a la ISO/IEC 29110-4-1:2011
Webinar - Introducción a la ISO/IEC 29110-4-1:2011jpalma200680
 
Style Framework - SXSW2015
Style Framework - SXSW2015Style Framework - SXSW2015
Style Framework - SXSW2015Marti Gold
 
Money Laundering Law Germany
Money Laundering Law GermanyMoney Laundering Law Germany
Money Laundering Law GermanyLutz Hartmann
 
Regalos del Chavez a otros Paises
Regalos del Chavez a otros PaisesRegalos del Chavez a otros Paises
Regalos del Chavez a otros PaisesParaulata Ilustrada
 
Muallim ul quran revised
Muallim ul quran revisedMuallim ul quran revised
Muallim ul quran revisedSikander Ghunio
 
Foro activación del empleo 2017. 29 30 MARZO IFEMA
Foro activación del empleo 2017. 29 30 MARZO IFEMAForo activación del empleo 2017. 29 30 MARZO IFEMA
Foro activación del empleo 2017. 29 30 MARZO IFEMAYOLANDA ROSCO GARCINUÑO
 
博進空手部・学費免除の裏技
博進空手部・学費免除の裏技博進空手部・学費免除の裏技
博進空手部・学費免除の裏技al_qrantz
 
IT技術者こそ覚えておきたい脳梗塞の症状
IT技術者こそ覚えておきたい脳梗塞の症状IT技術者こそ覚えておきたい脳梗塞の症状
IT技術者こそ覚えておきたい脳梗塞の症状なおき おさだ
 
Collective navigation of complex networks: Participatory greedy routing
Collective navigation of complex networks: Participatory greedy routingCollective navigation of complex networks: Participatory greedy routing
Collective navigation of complex networks: Participatory greedy routingKolja Kleineberg
 

En vedette (18)

Decorex Durban 2017 in pictures
Decorex Durban 2017 in picturesDecorex Durban 2017 in pictures
Decorex Durban 2017 in pictures
 
Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...
Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...
Brand Storytelling - Miért használj a tartalomterjesztéshez fizetett hirdetés...
 
Propuestas de resolución 2017
Propuestas de resolución 2017Propuestas de resolución 2017
Propuestas de resolución 2017
 
New Declassified Report Exposes Hamas Human Shield Policy
New Declassified Report Exposes Hamas Human Shield PolicyNew Declassified Report Exposes Hamas Human Shield Policy
New Declassified Report Exposes Hamas Human Shield Policy
 
Perché le aziende devono essere presenti su internet
Perché le aziende devono essere presenti su internetPerché le aziende devono essere presenti su internet
Perché le aziende devono essere presenti su internet
 
Presentación
PresentaciónPresentación
Presentación
 
Sportcongres noord nederland Jaap van Zessen
Sportcongres noord nederland Jaap van ZessenSportcongres noord nederland Jaap van Zessen
Sportcongres noord nederland Jaap van Zessen
 
Webinar - Introducción a la ISO/IEC 29110-4-1:2011
Webinar - Introducción a la ISO/IEC 29110-4-1:2011Webinar - Introducción a la ISO/IEC 29110-4-1:2011
Webinar - Introducción a la ISO/IEC 29110-4-1:2011
 
Style Framework - SXSW2015
Style Framework - SXSW2015Style Framework - SXSW2015
Style Framework - SXSW2015
 
Money Laundering Law Germany
Money Laundering Law GermanyMoney Laundering Law Germany
Money Laundering Law Germany
 
Regalos del Chavez a otros Paises
Regalos del Chavez a otros PaisesRegalos del Chavez a otros Paises
Regalos del Chavez a otros Paises
 
Don't Believe Trump's Hype: Regulations do Work for Business
Don't Believe Trump's Hype: Regulations do Work for BusinessDon't Believe Trump's Hype: Regulations do Work for Business
Don't Believe Trump's Hype: Regulations do Work for Business
 
Muallim ul quran revised
Muallim ul quran revisedMuallim ul quran revised
Muallim ul quran revised
 
Foro activación del empleo 2017. 29 30 MARZO IFEMA
Foro activación del empleo 2017. 29 30 MARZO IFEMAForo activación del empleo 2017. 29 30 MARZO IFEMA
Foro activación del empleo 2017. 29 30 MARZO IFEMA
 
Dev Ops without the Ops
Dev Ops without the OpsDev Ops without the Ops
Dev Ops without the Ops
 
博進空手部・学費免除の裏技
博進空手部・学費免除の裏技博進空手部・学費免除の裏技
博進空手部・学費免除の裏技
 
IT技術者こそ覚えておきたい脳梗塞の症状
IT技術者こそ覚えておきたい脳梗塞の症状IT技術者こそ覚えておきたい脳梗塞の症状
IT技術者こそ覚えておきたい脳梗塞の症状
 
Collective navigation of complex networks: Participatory greedy routing
Collective navigation of complex networks: Participatory greedy routingCollective navigation of complex networks: Participatory greedy routing
Collective navigation of complex networks: Participatory greedy routing
 

Similaire à AngularJS - podstawy

AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptJacek Okrojek
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaBartlomiej Zass
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykładynasza-klasa
 
Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!The Software House
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychFuture Processing
 
Łagodne wprowadzenie do Angular2
Łagodne wprowadzenie do Angular2Łagodne wprowadzenie do Angular2
Łagodne wprowadzenie do Angular2Jakub Nietrzeba
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaMarcin Gajda
 
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...Trójmiejska Grupa Testerska
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznieSages
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Quick-Solution
 
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUAMagento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUAMagento Meetup Wrocław
 
Red Green Hotfix – złudne poczucie bezpieczeństwa w testach
Red Green Hotfix – złudne poczucie bezpieczeństwa w testachRed Green Hotfix – złudne poczucie bezpieczeństwa w testach
Red Green Hotfix – złudne poczucie bezpieczeństwa w testachThe Software House
 
Optymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETOptymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETBartlomiej Zass
 
WebView security on iOS (PL)
WebView security on iOS (PL)WebView security on iOS (PL)
WebView security on iOS (PL)lpilorz
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPPiotr Gabryjeluk
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymDariusz Jagieło
 

Similaire à AngularJS - podstawy (20)

AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założenia
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykłady
 
Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowych
 
Łagodne wprowadzenie do Angular2
Łagodne wprowadzenie do Angular2Łagodne wprowadzenie do Angular2
Łagodne wprowadzenie do Angular2
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
 
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?
 
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUAMagento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
Magento Meetup Wrocław 6. "Venia Storefront Concept", Piotr Makowski VIRTUA
 
Red Green Hotfix – złudne poczucie bezpieczeństwa w testach
Red Green Hotfix – złudne poczucie bezpieczeństwa w testachRed Green Hotfix – złudne poczucie bezpieczeństwa w testach
Red Green Hotfix – złudne poczucie bezpieczeństwa w testach
 
Optymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETOptymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NET
 
Mobile services
Mobile servicesMobile services
Mobile services
 
WebView security on iOS (PL)
WebView security on iOS (PL)WebView security on iOS (PL)
WebView security on iOS (PL)
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHP
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastym
 

Plus de Apptension

Configuring Django projects for multiple environments
Configuring Django projects for multiple environmentsConfiguring Django projects for multiple environments
Configuring Django projects for multiple environmentsApptension
 
D3.js - A picture is worth a thousand words
D3.js - A picture is worth a thousand wordsD3.js - A picture is worth a thousand words
D3.js - A picture is worth a thousand wordsApptension
 
Universal Javascript in React
Universal Javascript in ReactUniversal Javascript in React
Universal Javascript in ReactApptension
 
Testerzy na orbicie
Testerzy na orbicieTesterzy na orbicie
Testerzy na orbicieApptension
 
An introduction to Angular2
An introduction to Angular2 An introduction to Angular2
An introduction to Angular2 Apptension
 

Plus de Apptension (6)

Configuring Django projects for multiple environments
Configuring Django projects for multiple environmentsConfiguring Django projects for multiple environments
Configuring Django projects for multiple environments
 
White Space
White SpaceWhite Space
White Space
 
D3.js - A picture is worth a thousand words
D3.js - A picture is worth a thousand wordsD3.js - A picture is worth a thousand words
D3.js - A picture is worth a thousand words
 
Universal Javascript in React
Universal Javascript in ReactUniversal Javascript in React
Universal Javascript in React
 
Testerzy na orbicie
Testerzy na orbicieTesterzy na orbicie
Testerzy na orbicie
 
An introduction to Angular2
An introduction to Angular2 An introduction to Angular2
An introduction to Angular2
 

AngularJS - podstawy

  • 1. AngularJS Podstawy Wojciech Panek - Tech Lead, Apptension www.apptension.com
  • 3. Cechy AngularJS • Framework MVC/MVVM • Dodatkowe atrybuty HTML • Modele w postaci POJO (Plain Old Javascript Object) • Zestaw komponentów ułatwiających organizację projektu • Two-way Data Binding • Dirty Checking • Zbudowany z wykorzystaniem jQuery • Duża popularność i wsparcie społeczności
  • 5. Komponenty - Module • Pozwala na grupowanie • Zarządzanie Dependency Injection • Konfiguracja
  • 6. Komponenty - Module var application = angular.module('countriesApp', [ 'ui.router' ]); application.config(['$locationProvider', '$stateProvider', '$urlRouterProvider', function($locationProvider, $stateProvider, $urlRouterProvider){ $locationProvider.hashPrefix(''); $stateProvider.state('countryList', { url: "/", templateUrl: "app/view/country-list.html" }); $stateProvider.state('countryView', { url: "/:name", templateUrl: "app/view/country-view.html" }); $urlRouterProvider.otherwise('/'); }]);
  • 7. Komponenty - Module <html data-ng-app="countriesApp"> <head lang="en"> <meta charset="UTF-8"> <title>AKAI Countries</title> </head> <body> <div data-ui-view></div> </body> </html>
  • 8. Komponenty - Controller • Dostarcza dane widokom ($scope) • Zawiera logikę widoków • Nie powinien manipulować drzewem DOM • Przypisywany widokom przy pomocy atrybutu HTML ng-controller
  • 9. Komponenty - Controller application.controller('countryListController', ['$scope', 'countryService', function($scope, countryService){ $scope.countries = []; $scope.loadingCountries = true; $scope.countryModel = { name: "", symbol: "" }; countryService.getList().then(function(list){ $scope.countries = list; $scope.loadingCountries = false; }); $scope.addCountry = function() { $scope.countries.push($scope.countryModel); $scope.countryModel = { name: "", symbol: "" } } }]);
  • 10. Komponenty - View • Zapisywany w języku HTML rozszerzonym o dodatkowe atrybuty • Ma dostęp do wszystkich elementów $scope • Dodatkowe atrybuty: – ng-if – ng-show/ng-hide – ng-click – ng-repeat – ng-model – ng-class – ng-style – ng-src – ng-attr-{{ }}
  • 11. Komponenty - View <div data-ng-controller="countryListController"> <data-loader data-is-loading="loadingCountries"> <div> <label for="country-name">Name:</label> <input type="text" data-ng-model="countryModel.name" name="CountryName" id="country-name" /> </div> <div> <label for="country-symbol">Symbol:</label> <input type="text" data-ng-model="countryModel.symbol" name=" CountrySymbol" id="country-symbol" /> </div> <div> <button data-ng-click="addCountry()">Add</button> </div> <hr> <div data-ng-repeat="country in countries track by $index"> <span> {{ country.name }} </span> <span> {{ country.symbol | countryCode }} </span> <a data-ui-sref="countryView({ name: country.name })"> view </a> </div> </data-loader> </div>
  • 12. Komponenty - Service • Oparty o wzorzec projektowy Singleton • Może zostać wstrzyknięty w dowolne miejsce aplikacji przy pomocy Dependency Injection • Często wykorzystywany do implementacji warstwy pobierającej dane • Może zostać wykorzystany do implementacji warstwy Modeli • Predefiniowane serwisy: – $http – $window – $q
  • 13. Komponenty - Service application.service('countryService', ['$http', '$q', function ($http, $q) { this.getList = function () { var deferred = $q.defer(); $http.get('https://restcountries.eu/rest/v1/all').success(function (data) { var result = []; for (var i = 0; i < data.length; i++) { result.push({ name: data[i].name, symbol: data[i].alpha2Code }); } deferred.resolve(result); }); return deferred.promise; }; }]);
  • 14. Komponenty - Factory • Działanie i zastosowanie identyczne jak Service • Zwraca wynik funkcji zamiast instancji funkcji
  • 15. Komponenty - Factory application.factory('countryFactory', ['$http', '$q', function ($http, $q) { return { getList: function() { var deferred = $q.defer(); $http.get('https://restcountries.eu/rest/v1/all').success(function (data) { var result = []; for (var i = 0; i < data.length; i++) { result.push({ name: data[i].name, symbol: data[i].alpha2Code }); } deferred.resolve(result); }); return deferred.promise; } }; }]);
  • 16. Komponenty - Directive • Komponent interfejsu użytkownika przeznaczony do wielokrotnego użytku • Nie powinien zawierać logiki biznesowej • Może manipulować drzewem DOM • Można do niego przekazać parametry: – = – @ – & • Często używany do inicjalizacji bibliotek jQuery • Częsty powód wycieków pamięci
  • 17. Komponenty - Directive application.directive('loader', [ function(){ return { restrict: 'AE', replace: true, transclude: true, templateUrl: 'app/directive/loader/loader.html', scope: { isLoading: '=' }, link: function($scope, element) { var scale = 10; var negative = true; $scope.animation = setInterval(function(){ angular.element(element).find(".loader").css('transform', 'scale(' + scale/10 + ')'); if(negative) scale -= 1; else scale += 1; if(scale == 0 || scale == 10) negative = !negative; }, 50); $scope.$on('$destroy', function() { clearInterval($scope.animation); }); } } } ]);
  • 18. Komponenty - Filter • Pozwala na manipulację danymi wejściowymi • Nie powinien zawierać logiki biznesowej • Domyślnie dostępny w widokach • Pozwala na przetwarzanie strumieniowe przy pomocy operatora | • Predefiniowane filtry: – orderBy – filter – date – currency
  • 19. Komponenty - Filter application.filter('countryCode', function() { return function(input) { return '[' + input + ']' }; });
  • 21. Zagrożenia i Problemy • Nauka AngularJS nie jest prosta • Skalowalność i wydajność aplikacji • Czytelność struktury projektu • Wycieki pamięci • Ograniczone narzędzia do pisania testów (Protractor) • Pokusa używania jQuery • SEO • AngularJS 2.0
  • 23. Biblioteki • ui-router • angular-bootstrap/angular-foundation • angular-ui • angular-translate • ngResource