SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
Podstawy AngularJS
Tomek Sułkowski
Front-end
Developer

Trener IT
Agenda
• Wprowadzenie / kontekst / narzędzia
• Teoria / demo
• Warsztat
• Teoria / demo
• Warsztat
• …
• Q & A
Intro
http://myholidays.com/#/jacuzzi/guys
SPA?
http://myholidays.com/#/mask/ftw
Narzędzia
WebStorm (IDE)
SublimeText 3 Atom 1.0 Brackets
… Vim?
Node Packaged
Modules
• system zarządzania zależnościami dla 

„server-side js”
• zależności opisywane w pliku package.json
• npm install - instaluje pakiety, których
jeszcze nie ma w projekcie
• npm update - sprawdza, czy istnieją nowsze
wersje pakietów + instaluje
• npm install nazwa-pakietu —save-dev
- instaluje pakiet, dodaje go do package.json
Bower
npm install -g bower
• zarządzanie zależnościami dla client-side js
• zależności opisywane w bower.json
• bower install - instaluje pakiety, których jeszcze
nie ma w projekcie
• bower update - sprawdza, czy istnieją nowsze
wersje pakietów + instaluje
• bower install nazwa-pakietu --save 

- instaluje pakiet, dodaje go do bower.json
• pakiety instalowane są do katalogu 

/bower_components/nazwa-pakietu/…

- stamtąd należy je linkować w plikach html
AngularJS
Module
Config
[ module1, module2, module3, … ]
Routing
View
(template)
Controller Service
Directive
$scope
Moduły, struktura aplikacji
• Moduły wskazują na zależności od zewnętrznych bibliotek
• Moduły nie separują zawieranych komponentów
(namespaces)
• Poszczególne fragmenty aplikacji jako moduły,

o hierarchii odzwierciedlonej w strukturze katalogów
Form Follows Function
OPINIA
Routing
ngRoute
ui.router
$stateProvider
.state('state1.list', {
url: "/list",
templateUrl: "partials/state1.list.html",
controller: "ListController"
})
demo: http://plnkr.co/edit/u18KQc
.config(function($routeProvider) {
$routeProvider.when('/view1', {
templateUrl: 'view1/view1.html',
controller: 'View1Ctrl'
});
})
warsztat
Widok
Zwyczajny dokument HTML rozszerzony o:
• dyrektywy, np. ng-init
• wyrażenia w klamrach, np. {{ age + 8 }}
1 <div ng-controller="PersonCtrl">
2 <input type="text" ng-model="firstName">
3 <input type="text" ng-model="lastName">
4
5 <p>Witaj {{ firstName }} {{ lastName }}</p>
6
7 <a ng-click="clearName()">wykasuj dane</a>
8 </div>
Controller
• Zwykła JavaScriptowa funkcja
• Powiązanie z widokiem odbywa się przez $scope


1 myApp.controller('PersonCtrl', function($scope)
2 {
3 $scope.firstName = 'John';
4 $scope.lastName = 'Smith';
5
6 $scope.clearName = function() {
7 $scope.firstName = $scope.lastName = '';
8 };
9 });
Dyrektywy
<html>
<my-calendar></my-calendar>
<div my-calendar=2014></div>
<div class="my-calendar: 2014">

<!— directive: my-calendar 2014 -->
demo
Usługi
• Miejsce na logikę biznesową
• Metody pomocnicze, 

powtarzalny kod
• Współdzielone dane / model
Po co? Jak?
.constant(…
.value(…
.service(…
.factory(…
.provider(…
usługi wbudowane: https://docs.angularjs.org/api/ng/service
Service
1 myApp.service('helloService', function () {
2
3 this.sayHello = function () {
4 return this.greeting + ' world!';
5 };
6
7 this.greeting = 'Hello';
8
9 });
Factory
1 myApp.factory('Person', function() {
2 function Person(firstName, lastName) {
3 this.firstName = firstName;
4 this.lastName = lastName;
5 this.age = 0;
6 }
7
8 Person.prototype.getFullName = function () {
9 return this.firstName + ' ' + this.lastName;
10 }
11
12 return Person;
13 });
Obietnice
http://andyshora.com/promises-angularjs-explained-as-cartoon.html
$q
warsztat
Dyrektywy
• Enkapsulują logikę związaną z zachowaniem
elementu interfejsu
• Tworzą widgety - małe aplikacje, klocki z których
budujemy większe fragmenty…
Directive Definition Object
1 myApp.directive('awesome', function () {
2 return {
3 priority: 0,
4 template: '<div>…</div>',
5 replace: true,
6 transclude: true,
7 restrict: 'A',
8 scope: {…},
9 link: function postLink(scope, element, attrs) {
10
11 }
12 };
13 })
Izolowany scope
<my-race start="race.start" days="race.days"
cheer="'Hurrah!'" on-finish="goDance()">
</my-race>
1 .directive('myRace', function () {
2 return {
… ...
4 scope: {
5 dateStart: '=start'
6 days: '=',
7 cheer: '@',
8 finishCallback: '&onFinish'
9 }
10 };
11 });
warsztat
Filtry
• Umożliwiają przekształcenie danych w trakcie
przejścia ze $scope do widoku bez zmieniania
oryginalnej wartości.
1 {{ user.firstName | uppercase }}
2 Jack -> JACK
3
4 {{ user.createdAt | date:'dd.MM.yyyy, HH:mm' }}
5 Wed Mar 05 2014 14:22:01 GMT+0100 (CET) -> 05.03.2014, 14:22
6 1394025721000 -> 05.03.2014, 14:22
7
8 {{ user.interests | orderBy:'toString()':true | limitTo:2 }}
9 ['movies','sports','gaming','travel'] -> ['travel','sports']
Własne Filtry
Definiowanie własnego filtra sprowadza się do deklaracji
prostej funkcji:
1 myApp.filter('slice', function() {
2 return function(arr, start, end) {
3 return (arr || []).slice(start, end);
4 };
5 });
nazwa filtra
wartość na wejściu kolejne parametry
warsztat
Formularze
Element <form name="sampleform" novalidate>
to dyrektywa, która dostarcza kilka przydatnych zachowań
dotyczących pracy z formularzami. 

Najważniejszym jest obsługa walidacji.
1 <input type="email"
2 ng-model="{ string }"
3 name="{ string }"
4 required
5 ng-required="{ boolean }"
6 ng-minlength="{ number }"
7 ng-maxlength="{ number }"
8 ng-pattern="{ string }"
9 ng-change="{ string }">
10 </input>
Walidacja
<form name="userform">
<input type="email" name="mail" ng-model="field" required minlength="5"/>
<div ng-messages="userform.mail.$error" ng-messages-multiple>
<p ng-message="required">Pole obowiązkowe</p>
<p ng-message="minlength">Zbyt krótka wartość</p>
<p ng-message="email">Wartość nie jest e-mailem</p>
</div>
</form>
<button type="submit" class="btn btn-primary"
ng-disabled="userForm.$invalid">
Zapisz
</button>
form.ng-dirty { background: #e6f2ff }
.ng-invalid-max-length { border-color: red }
warsztat
Co dalej?
więcej na temat organizacji kodu i innych dobrych praktyk:


https://github.com/toddmotto/angularjs-styleguide
https://github.com/johnpapa/angularjs-styleguide
Co dalej?
Regularne szkolenia w grupach 4-8 osób
Więcej materiału
Więcej case’ów
Więcej elastyczności i czasu
Więcej lunchy :)
A konkretnie?
Oraz
Pytania?
Dziękuję
Podstawy AngularJS
Tomek Sułkowski

Mais conteúdo relacionado

Mais procurados

Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
Wojciech Lichota
 

Mais procurados (20)

Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScriptZnaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
 
Angular Restmod
Angular RestmodAngular Restmod
Angular Restmod
 
GraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem ApolloGraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem Apollo
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
 
Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
 
Architektura ngrx w angular 2+
Architektura ngrx w angular 2+Architektura ngrx w angular 2+
Architektura ngrx w angular 2+
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
 
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach. Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
 
TypeScript as a runtime error terminator
TypeScript as a runtime error terminatorTypeScript as a runtime error terminator
TypeScript as a runtime error terminator
 
RxJava & Hystrix - Perfect match for distributed applications
RxJava & Hystrix - Perfect match for distributed applicationsRxJava & Hystrix - Perfect match for distributed applications
RxJava & Hystrix - Perfect match for distributed applications
 
Kickoff to Node.js
Kickoff to Node.jsKickoff to Node.js
Kickoff to Node.js
 
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
 
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
 
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
Paweł Kucharski: Oswajamy Słonia czyli po co nam HadoopPaweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
 
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
 
Hugo - make webdev fun again
Hugo - make webdev fun againHugo - make webdev fun again
Hugo - make webdev fun again
 
infoShare AI Roadshow 2018 - Magdalena Wójcik (Data Love) - Data Science na d...
infoShare AI Roadshow 2018 - Magdalena Wójcik (Data Love) - Data Science na d...infoShare AI Roadshow 2018 - Magdalena Wójcik (Data Love) - Data Science na d...
infoShare AI Roadshow 2018 - Magdalena Wójcik (Data Love) - Data Science na d...
 
GlusterFS
GlusterFSGlusterFS
GlusterFS
 
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
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
 

Destaque

Wprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache HadoopWprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache Hadoop
Sages
 

Destaque (11)

Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash courseCodepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
 
Zrób dobrze swojej komórce - programowanie urządzeń mobilnych z wykorzystanie...
Zrób dobrze swojej komórce - programowanie urządzeń mobilnych z wykorzystanie...Zrób dobrze swojej komórce - programowanie urządzeń mobilnych z wykorzystanie...
Zrób dobrze swojej komórce - programowanie urządzeń mobilnych z wykorzystanie...
 
Bezpieczne dane w aplikacjach java
Bezpieczne dane w aplikacjach javaBezpieczne dane w aplikacjach java
Bezpieczne dane w aplikacjach java
 
Wprowadzenie do technologii Puppet
Wprowadzenie do technologii PuppetWprowadzenie do technologii Puppet
Wprowadzenie do technologii Puppet
 
Szybkie wprowadzenie do eksploracji danych z pakietem Weka
Szybkie wprowadzenie do eksploracji danych z pakietem WekaSzybkie wprowadzenie do eksploracji danych z pakietem Weka
Szybkie wprowadzenie do eksploracji danych z pakietem Weka
 
Jak zacząć przetwarzanie małych i dużych danych tekstowych?
Jak zacząć przetwarzanie małych i dużych danych tekstowych?Jak zacząć przetwarzanie małych i dużych danych tekstowych?
Jak zacząć przetwarzanie małych i dużych danych tekstowych?
 
Architektura aplikacji android
Architektura aplikacji androidArchitektura aplikacji android
Architektura aplikacji android
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemWprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
 
Wprowadzenie do Big Data i Apache Spark
Wprowadzenie do Big Data i Apache SparkWprowadzenie do Big Data i Apache Spark
Wprowadzenie do Big Data i Apache Spark
 
Wprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache HadoopWprowadzenie do technologi Big Data i Apache Hadoop
Wprowadzenie do technologi Big Data i Apache Hadoop
 
Vert.x v3 - high performance polyglot application toolkit
Vert.x v3 - high performance  polyglot application toolkitVert.x v3 - high performance  polyglot application toolkit
Vert.x v3 - high performance polyglot application toolkit
 

Semelhante a Podstawy AngularJS

AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)
Marcin Baran
 

Semelhante a Podstawy AngularJS (20)

Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?
 
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
PLNOG 8: Tomasz Sawiak - Log management i analizy > to czego nie widać
PLNOG 8: Tomasz Sawiak - Log management i analizy > to czego nie widać PLNOG 8: Tomasz Sawiak - Log management i analizy > to czego nie widać
PLNOG 8: Tomasz Sawiak - Log management i analizy > to czego nie widać
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelniania
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
[PLCUG] Power shell (PL)
[PLCUG] Power shell (PL)[PLCUG] Power shell (PL)
[PLCUG] Power shell (PL)
 
AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Torquebox
TorqueboxTorquebox
Torquebox
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
 
Jak nie narobić sobie problemów korzystając z EntityFramework
Jak nie narobić sobie problemów korzystając z EntityFrameworkJak nie narobić sobie problemów korzystając z EntityFramework
Jak nie narobić sobie problemów korzystając z EntityFramework
 
Citrix NetScaler Gateway i Azure MFA
Citrix NetScaler Gateway i Azure MFACitrix NetScaler Gateway i Azure MFA
Citrix NetScaler Gateway i Azure MFA
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Łukasz Grala - WSKIZ 2009-04-07 It Academic - SQL Server 2008 - Nowości Adm...
Łukasz Grala - WSKIZ 2009-04-07 It Academic - SQL Server 2008 - Nowości   Adm...Łukasz Grala - WSKIZ 2009-04-07 It Academic - SQL Server 2008 - Nowości   Adm...
Łukasz Grala - WSKIZ 2009-04-07 It Academic - SQL Server 2008 - Nowości Adm...
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
 
Błędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderówBłędy userów, niedoróbki koderów
Błędy userów, niedoróbki koderów
 

Mais de Sages (6)

Python szybki start
Python   szybki startPython   szybki start
Python szybki start
 
Budowanie rozwiązań serverless w chmurze Azure
Budowanie rozwiązań serverless w chmurze AzureBudowanie rozwiązań serverless w chmurze Azure
Budowanie rozwiązań serverless w chmurze Azure
 
Docker praktyczne podstawy
Docker  praktyczne podstawyDocker  praktyczne podstawy
Docker praktyczne podstawy
 
Jak działa blockchain?
Jak działa blockchain?Jak działa blockchain?
Jak działa blockchain?
 
Qgis szybki start
Qgis szybki startQgis szybki start
Qgis szybki start
 
Architektura SOA - wstęp
Architektura SOA - wstępArchitektura SOA - wstęp
Architektura SOA - wstęp
 

Podstawy AngularJS

  • 3. Agenda • Wprowadzenie / kontekst / narzędzia • Teoria / demo • Warsztat • Teoria / demo • Warsztat • … • Q & A
  • 6. Narzędzia WebStorm (IDE) SublimeText 3 Atom 1.0 Brackets … Vim?
  • 7. Node Packaged Modules • system zarządzania zależnościami dla 
 „server-side js” • zależności opisywane w pliku package.json • npm install - instaluje pakiety, których jeszcze nie ma w projekcie • npm update - sprawdza, czy istnieją nowsze wersje pakietów + instaluje • npm install nazwa-pakietu —save-dev - instaluje pakiet, dodaje go do package.json
  • 8. Bower npm install -g bower • zarządzanie zależnościami dla client-side js • zależności opisywane w bower.json • bower install - instaluje pakiety, których jeszcze nie ma w projekcie • bower update - sprawdza, czy istnieją nowsze wersje pakietów + instaluje • bower install nazwa-pakietu --save 
 - instaluje pakiet, dodaje go do bower.json • pakiety instalowane są do katalogu 
 /bower_components/nazwa-pakietu/…
 - stamtąd należy je linkować w plikach html
  • 10. Module Config [ module1, module2, module3, … ] Routing View (template) Controller Service Directive $scope
  • 11. Moduły, struktura aplikacji • Moduły wskazują na zależności od zewnętrznych bibliotek • Moduły nie separują zawieranych komponentów (namespaces) • Poszczególne fragmenty aplikacji jako moduły,
 o hierarchii odzwierciedlonej w strukturze katalogów Form Follows Function OPINIA
  • 12. Routing ngRoute ui.router $stateProvider .state('state1.list', { url: "/list", templateUrl: "partials/state1.list.html", controller: "ListController" }) demo: http://plnkr.co/edit/u18KQc .config(function($routeProvider) { $routeProvider.when('/view1', { templateUrl: 'view1/view1.html', controller: 'View1Ctrl' }); })
  • 14. Widok Zwyczajny dokument HTML rozszerzony o: • dyrektywy, np. ng-init • wyrażenia w klamrach, np. {{ age + 8 }} 1 <div ng-controller="PersonCtrl"> 2 <input type="text" ng-model="firstName"> 3 <input type="text" ng-model="lastName"> 4 5 <p>Witaj {{ firstName }} {{ lastName }}</p> 6 7 <a ng-click="clearName()">wykasuj dane</a> 8 </div>
  • 15. Controller • Zwykła JavaScriptowa funkcja • Powiązanie z widokiem odbywa się przez $scope 
 1 myApp.controller('PersonCtrl', function($scope) 2 { 3 $scope.firstName = 'John'; 4 $scope.lastName = 'Smith'; 5 6 $scope.clearName = function() { 7 $scope.firstName = $scope.lastName = ''; 8 }; 9 });
  • 17. demo
  • 18. Usługi • Miejsce na logikę biznesową • Metody pomocnicze, 
 powtarzalny kod • Współdzielone dane / model Po co? Jak? .constant(… .value(… .service(… .factory(… .provider(… usługi wbudowane: https://docs.angularjs.org/api/ng/service
  • 19. Service 1 myApp.service('helloService', function () { 2 3 this.sayHello = function () { 4 return this.greeting + ' world!'; 5 }; 6 7 this.greeting = 'Hello'; 8 9 });
  • 20. Factory 1 myApp.factory('Person', function() { 2 function Person(firstName, lastName) { 3 this.firstName = firstName; 4 this.lastName = lastName; 5 this.age = 0; 6 } 7 8 Person.prototype.getFullName = function () { 9 return this.firstName + ' ' + this.lastName; 10 } 11 12 return Person; 13 });
  • 23. Dyrektywy • Enkapsulują logikę związaną z zachowaniem elementu interfejsu • Tworzą widgety - małe aplikacje, klocki z których budujemy większe fragmenty…
  • 24. Directive Definition Object 1 myApp.directive('awesome', function () { 2 return { 3 priority: 0, 4 template: '<div>…</div>', 5 replace: true, 6 transclude: true, 7 restrict: 'A', 8 scope: {…}, 9 link: function postLink(scope, element, attrs) { 10 11 } 12 }; 13 })
  • 25. Izolowany scope <my-race start="race.start" days="race.days" cheer="'Hurrah!'" on-finish="goDance()"> </my-race> 1 .directive('myRace', function () { 2 return { … ... 4 scope: { 5 dateStart: '=start' 6 days: '=', 7 cheer: '@', 8 finishCallback: '&onFinish' 9 } 10 }; 11 });
  • 27. Filtry • Umożliwiają przekształcenie danych w trakcie przejścia ze $scope do widoku bez zmieniania oryginalnej wartości. 1 {{ user.firstName | uppercase }} 2 Jack -> JACK 3 4 {{ user.createdAt | date:'dd.MM.yyyy, HH:mm' }} 5 Wed Mar 05 2014 14:22:01 GMT+0100 (CET) -> 05.03.2014, 14:22 6 1394025721000 -> 05.03.2014, 14:22 7 8 {{ user.interests | orderBy:'toString()':true | limitTo:2 }} 9 ['movies','sports','gaming','travel'] -> ['travel','sports']
  • 28. Własne Filtry Definiowanie własnego filtra sprowadza się do deklaracji prostej funkcji: 1 myApp.filter('slice', function() { 2 return function(arr, start, end) { 3 return (arr || []).slice(start, end); 4 }; 5 }); nazwa filtra wartość na wejściu kolejne parametry
  • 30. Formularze Element <form name="sampleform" novalidate> to dyrektywa, która dostarcza kilka przydatnych zachowań dotyczących pracy z formularzami. 
 Najważniejszym jest obsługa walidacji. 1 <input type="email" 2 ng-model="{ string }" 3 name="{ string }" 4 required 5 ng-required="{ boolean }" 6 ng-minlength="{ number }" 7 ng-maxlength="{ number }" 8 ng-pattern="{ string }" 9 ng-change="{ string }"> 10 </input>
  • 31. Walidacja <form name="userform"> <input type="email" name="mail" ng-model="field" required minlength="5"/> <div ng-messages="userform.mail.$error" ng-messages-multiple> <p ng-message="required">Pole obowiązkowe</p> <p ng-message="minlength">Zbyt krótka wartość</p> <p ng-message="email">Wartość nie jest e-mailem</p> </div> </form> <button type="submit" class="btn btn-primary" ng-disabled="userForm.$invalid"> Zapisz </button> form.ng-dirty { background: #e6f2ff } .ng-invalid-max-length { border-color: red }
  • 33. Co dalej? więcej na temat organizacji kodu i innych dobrych praktyk: 
 https://github.com/toddmotto/angularjs-styleguide https://github.com/johnpapa/angularjs-styleguide
  • 34. Co dalej? Regularne szkolenia w grupach 4-8 osób Więcej materiału Więcej case’ów Więcej elastyczności i czasu Więcej lunchy :)
  • 36. Oraz