Moderní webové aplikace

Transkript

Moderní webové aplikace
Moderní webové aplikace
AngularJS
Milan Lempera
Víťa Plšek
@milanlempera
@winsik
PHP -> Javascript
PHP -> Java -> Javascript
www.angular.cz
@angular_cz
?
vše si
poskládat z
knihoven
použít
framework
AngularJS je framework
Psal se rok 2009 … ano … 2009 ...
Jak se tehdy tvořili webové aplikace ?
● pomocí server-side frameworků
● scriptování v jQuery
Původním cílem AngularJS byl komerční framework
● náhrada stávajících view
● příklon k Single Page aplikacím
Serverside
VS
SPA
Serverside
VS
SPA
požadavek
1.požadavek
HTML - celá stránka
aplikace
požadavek
požadavek na data
HTML - konkrétní oblast
data
Šablonový systém v AngularJS
<html ng-app>
<head>
<script src="https://…../angularjs/1.4.8/angular.min.js"></script>
</head>
<body>
<h1>Ahoj {{city.name}}</h1>
Upravit oslovení: <input type="text" ng-model="city.name" />
</body>
</html>
ukázka
Directivy
<span ng-if="user.enabled">
{{user.name}}
</span>
<tr ng-repeat="user in users">
<td>{{user.name}}</td>
</tr>
Dvoucestný databinding - milovaný i nenáviděný
Dvoucestný databinding - milovaný i nenáviděný
<h1>Ahoj {{city.name}}</h1>
Upravit oslovení: <input type="text" ng-model="city.name" />
last value
curent value
changed?
{{city.name}}
“”
“”
false
city.name
(ngModelWatch)
“”
“”
false
Watcher
Dvoucestný databinding - milovaný i nenáviděný
<h1>Ahoj {{city.name}}</h1>
Upravit oslovení: <input type="text" ng-model="city.name" />
last value
curent value
changed?
{{city.name}}
“”
“Plzeň”
true
city.name
(ngModelWatch)
“”
“Plzeň”
true
Watcher
Dvoucestný databinding - milovaný i nenáviděný
<h1>Ahoj {{city.name}}</h1>
Upravit oslovení: <input type="text" ng-model="city.name" />
last value
curent value
changed?
{{city.name}}
“Plzeň”
“Plzeň”
false
city.name
(ngModelWatch)
“Plzeň”
“Plzeň”
false
Watcher
Dvoucestný databinding - jak s ním žít
− angular výrazy vyhodnocuje pokud se něco mohlo změnit
○ musí být rychlé
○ nemáte pod kontrolou počet volání
− počet watcherů < ~2500
+ výměnou za to můžete pracovat přímo s JS objekty
+ ve většině případů vám ušetří čas a kód
Formuláře
<form name="breweryForm">
<input id="brewery-year"
type="number"
name="year"
ng-model="brewery.year"
required />
</form>
// angular vytvoří objekt
breweryForm = { = {
breweryForm.year
$submitted:
$dirty:
false, false,
$pristine: true,
$dirty: false,
$valid:
false, $invalid:
$pristine: true,
true,
$valid: false,
$touched:
false,$invalid: true,
$error: {required:
$untouched:
true,Array[1]}
} $error: {
“number”: true
“required”: true
}
}
Dependency injection
var UserStore = function() {
this.httpService = HTTPService.getInstance();
}
var UserStore = function(httpService) {
this.httpService = httpService;
}
Dependency injection v angularu
var BreweryServiceConstructor = function() {
// služba řeší komunikaci se serverem
}
var BreweryController = function(breweryService) {
this.breweries = breweryService.load();
};
angular.module("beerApp", [])
.controller("BreweryController", BreweryController)
.service("breweryService", BreweryServiceConstructor);
Komunikace se serverem
$http - základní rozhraní
$resource - jednoduché pojetí RESTu
var Brewery = $resource('/api/v1/brewery/:id', {id : '@id'});
var list = Brewery.query({'page' : 2});
// GET /api/v1/brewery
var brewery42 = Brewery.get({id : 42}); // GET /api/v1/brewery/42
brewery42.name = 'Janáček';
brewery42.$save();
//
POST
/api/v1/brewery/42
brewery42.$delete();
//
DELETE
/api/v1/brewery/42
Promise
step1(function (value1) {
step2(value2, function(value3) {
step3(value3, …. );
});
});
functionWithPromise()
.then(promisedStep2)
.then(function (value2) {
// Do something
})
.catch(function (error) {
// Handle error from
// all above steps
})
Interceptory
ratingService
Server
Intercetor
přidat hodnocení
401 Unauthorized
Modální přihlašovací okno
požadavek na přihlášení
Klient
autentizační token
přidat hodnocení (opakovaný požadavek)
hodnocení přidáno (201 Created)
Routing
#/brewery
controller: BreweryListController,
templateUrl: brewery/list.html
#/brewery/edit/:id
controller: BreweryEditController,
templateUrl: brewery/edit.html
brewery/list.html
nebo
brewery/edit.html
Vlastní elementy - directivy
potřebujeme
● předat data
● reagovat na akce
<brewery-form
brewery="....."
on-save="....."
on-cancel=".....">
</brewery-form>
Vlastní elementy - directivy / komponenety
var componentDefinitionObject = {
templateUrl: "breweryForm.html",
<brewery-form
brewery="....."
on-save="....."
on-cancel=".....">
</brewery-form>
controller: controllerConstructor,
bindings: {
brewery: '=',
onSave: '&',
onCancel: '&'
}
};
angular.module('beerApp.breweryForm', [])
.component("breweryForm", function() {
return componentDefinitionObject;
})
Proč si angular vybrat
●
●
●
●
●
●
Výborná dokumentace
Početná komunita
Ucelený framework
Oddělení kódu a html
Velké množství komponent a knihoven
Testovatelnost
○
○
ngMock
protractor
Protractor - End to End testing for Angular
● nádstavba nad Seleniem
● přidává lokátory specifické pro Angular
element(by.id('gobutton'));
element(by.css('selected'));
element(by.binding('user.name'));
element(by.model('product.count'));
element(by.repeater('product.count'));
AngularJS
přerostl své odvětví
\
MOST POPULAR TECHNOLOGIES
Stack Overflow - Developer Survey 2015
Kdy ho použít?
Aplikace, aplikace aplikace
● informační systémy
● kalkulační nástroje
● … téměř cokoli za přihlášením
Tam kde potřebujete vyměnit view a dokážete postavit REST API
Kdy ho nepoužít?
Z důvodu SEO
Z důvodu výkonu
● klasické webové stránky
● vysoce dynamické aplikace
● “Excel”
(není náhrada jQuery)
● inzerce, e-shopy ?
Na co si dát pozor?
● množství a rychlost watcherů
● více aplikací na jedné stránce
● pište čistý kód
○ malé části kódu řešící jedem problém
● nespoléhejte na odstínění od javascriptu
○ prototypová dědičnost
○ promise
○ this
● dbejte na architekturu
Kdo ho používá
Youtube, PayPal, Mall, GoG, InvisionApp, Blue Origin, Lego
Indiegogo, Docker, Best buy, NBA, Forbes, CNN,
Weather...
https://www.madewithangular.com
Angular 2
● první zmínky 5/2014
● Designed for the future
● 2.0.0-beta.6 (2016-02-11)
● bude to úplně jiný framework
Angular 2 - technologie
● psaný v TypeScriptu
● podpora pro ES5, ES6 i Dart
● používá RxJS (Reactive eXtension for JS)
○
a set of libraries to compose asynchronous and event-based programs
using observable collections and Array#extras style composition in JS
○
funkcionální reaktivní programovní
○
developed by Microsoft Open Technologies, Inc.
Budoucnost - 1.x vs 2.x
● datum vydání 2.0 - x / 2016
● upgrade?
○ použití 1.x komponent v 2.x (ngUpgrade)
○ použítí 2.x komponent v 1.x (ngForward)
○ spokojeně pokračovat na 1.x
Má smysl na něj čekat?
● rozhodně stojí za to ho sledovat
Díky za pozornost ...
Zdroje - www.angular.cz/moderni-web-16

Podobné dokumenty

Technické řešení komunikace s Evernote

Technické řešení komunikace s Evernote vytvořenými přímo vývojáři Evernote. Nejedná se tedy o rozhraní, které trpí nějakými “mouchami“, protože ty už byly odstraněny samotným Evernote týmem. Protokol umožňuje komunikaci z libovolného ty...

Více

Operaèní výzkum

Operaèní výzkum Úlohy určitého typu mohou mít spousty různých instancí (konkrétních případů), které se liší např. v konkrétních hodnotách číselných parametrů. Instance úlohy je konkrétní případ úlohy, který je zad...

Více

Dokumentace - Dušan Jenčík

Dokumentace - Dušan Jenčík na stejném stroji (počítač, server) jako webový systém, a proto nedochází k delším latencím při přístupu. Tím, že je oddělen obsah od aplikace, získáváme velikou flexibilitu hlavně při práci v týmu...

Více