





Angular
- Framework construído sobre o padrão MVVM
- Criado em 2009 por Miško Hevery e Adam Abrons no Google
- Desenvolvimento menos imperativo e mais declarativo
- Single Page Application
- Abstrair a manipulação do DOM
- Two Way Data Binding

Angular no github


Google Apps By Angular


https://www.madewithangular.com/categories/angular
A Web mudou como nunca
- Web Components
- Shadow Dom
- Ecma Script 6, 7+
- Web Workers
- Services Workers
- Mobile Apps
- PWA








Mas será que ele é rápido?

https://www.stefankrause.net/js-frameworks-benchmark7/table.html
Typescript, What??
- Projeto opensource criado pela microsoft
- Transpiler de JS para Ecma Script 6, 7 e next
- Linguagem tipada, com recursos como interface e suporte à operações assíncronas
- Onde todas as features são estritamente opicionais
- Todo Javascript válido deve ser um TS válido
- Promete se manter fiel ao futuro do ES Next
- Ferramental e refactor de grandes apps

TypeScript no GitHub


Ferramental, Reactor?


Você não precisa tipar seu código

https://github.com/DefinitelyTyped/DefinitelyTyped

Quem está com o Google nessa?
https://www.typescriptlang.org/samples/index.html


Arquitetura


Angular CLI

> npm install -g angular-cli
> ng --help
> ng new my-project-name
> ng serve
> ng generate route|component|pipe|module|etc myName
> ng build
> ng test
> ng e2e
Módulos

- Base da nova arquitetura
- Módulos são ótimos para organizar a aplicação
- São definidos pelas annotation NgModule
- Contém um conjunto de componentes, diretivas e pipes para consolidar sua aplicação
- É a camada macro do sistema
- Eles são lazy load!
Exemplo de módulos

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@NgModule({
imports: [ BrowserModule ],
providers: [ Logger ],
declarations: [ AppComponent ],
exports: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }Hierarquia


Componentes

- São diretivas que tem uma interface com o usuário através de um template
- Contem a lógica de interação com usuário
- São criadas, atualizadas e destruídas pelo angular conforme o usuário interage com a aplicação.
- Possuem método "hooks" para acompanhar o ciclo de vida!
Exemplo de componentes

export class HeroListComponent implements OnInit {
heroes: Hero[];
selectedHero: Hero;
constructor(private service: HeroService) { }
ngOnInit() {
this.heroes = this.service.getHeroes();
}
selectHero(hero: Hero) { this.selectedHero = hero; }
}Um pouco sobre data-bindings


Pipes/Filtros

- Filtros agora são chamadas de Pipes e foram reformulados
- Os antigos são grandes causadores de performance
- Pipes são puros por padrão, executando funções puras
- Permitem declarar transformações de valor de exibição em seu HTML de modelo!
Exemplos de Pipes

// TypeScript
import { Pipe } from '@angular/core';
import { Http } from '@angular/http';
@Pipe({ name: 'fetch', pure: false })
export class FetchPipe {
private data = null;
private prevUrl = '';
constructor(private http: Http) { }
transform(url: string): any {
if (url !== this.prevUrl) {
this.prevUrl = url;
this.data = null;
this.http.get(url)
.map( result => result.json() )
.subscribe( d => this.data = d );
}
return this.data;
}
}<p>{{data.url | fetch}}</p>Diretivas

- São objetos de manipulação dinâmica de templates, sem template próprio e sem interação com o usuário
- Vem em dois sabores distintos:
-
Estruturais: que alteram o layout adicionando, removendo ou substituindo porções do template, como *ngIf, *ngFor
- Atributos: modificam a aparência ou comportamento de outro elemento, com [(ngModel)]
-
Estruturais: que alteram o layout adicionando, removendo ou substituindo porções do template, como *ngIf, *ngFor
Exemplo de Diretivas

// TypeScript
import { Directive, Input } from '@angular/core';
import { TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[myUnless]'
})
export class UnlessDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) {}
@Input() set myUnless(myUnless: boolean) {
if (!myUnless)
this.viewContainer.createEmbeddedView(this.templateRef);
else this.viewContainer.clear();
}
}Services

- É uma categoria ampla e abrangente que inclui qualquer valor, função ou recurso de quem aplicativo precisa

- Um serviço é tipicamente uma classe com um propósito estreito e bem definido, deve fazer algo específico e fazê-lo bem
Exemplos de Serviço

@Service()
export class Logger {
log(msg: any) { console.log(msg); }
error(msg: any) { console.error(msg); }
warn(msg: any) { console.warn(msg); }
}
@Service()
export class HeroService {
constructor(
private readonly backend: BackendService,
private readonly logger: Logger
) { }
getHeroes(): Observable<Hero[]> {
return this.backend.getAll(Hero).pipe(
tap(heroes => this.logger.log(`Fetched ${heroes.length} heroes.`))
)
}
}Dependency Injection


- Componente consomem serviços que estão disponíveis
- DI mantém um contêiner de instâncias que ele já criou e as reutiliza quando possível.
- Cada serviço é um singleton do seu módulo
Exemplo Dependency Injection



Disponibilizando instâncias de serviços


Disponibilizando instâncias por componente


Data Binding


Exemplo de Data Binding

<div>{{model.name}}</div>
<model-detail [model]="model"></model-detail>
<div (click)="selectItem(model)"></div>
<input [(ngModel)]="model.name">Two Data Binding como sugar sintaxe

<input
[value]="model.name"
(input)="model.name = $event.target.value">
<input [(ngModel)]="model.name">
[(x)]="e" <==> [x]="e" (xChange)="e=$event"Detecção de mudanças

- AngularJS 1.x faz custosos ciclos de dirty checking por toda aplicação a cada mudança nos objetos em seu escopo
- Angular IO: Cria uma estrutura de grafo em árvore com os componentes, varrendo de forma unidirecional, da raiz para as folhas, propaganda as mudanças para evitar novos ciclos
- Estratégia padrão ainda varre a árvore toda
Grafo em Árvore?


Dados imutável é a cereja do bolo

- O angular 2x 4x 5x e 6x sabe tirar proveito de dados Imutáveis
- Podemos mudar a estratégia de atualização dos componentes ou da aplicação como um todo, para uma mais performática
- Imutabilidade requer novos paradigmas de programação para se tornar prático e fluente em nosso dia a dia
- Programação funcional, Reactive e Streams ao resgate
Streams são a fundação do Angular

- Streams são fluxos de dados assícronos
- Parecidos com promises, mas muito mais poderosos.
- Podem ser mergeados e transformados declarativamente
- Http, HttpClient e outros módulos que retornavam promises agora retornar streams, retrocompatíveis com promises
- Reactive Extensions (RxJS) é o novo $q
Alguns exemplos RxJS

// TypeScript
import { Component, ChangeDetectionStrategy } from '@angular/core';
import { Observable } from 'rxjs/Rx';
@Component({
selector: 'hero-message',
changeDetection: ChangeDetectionStrategy.OnPush,
template: '<p>Hey: {{ messages | async }}</p>',
})
export class HeroAsyncMessageComponent {
private messageList = [
'You are my hero!',
'You are the best hero!',
'Will you be my hero?'
];
constructor() {
this.messages = Observable.interval(500)
.map(i => this.messageList[i])
.take(this.messageList.length);
}
}Alguns exemplos RxJS


Fontes

-
Reactive Programming:
- http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html
- http://reactivex.io/
-
Angular IO
- https://angular.io/guide/quickstart
-
Angular Material
- material.angular.io
-
Firebase
- https://github.com/angular/angularfire2
gdg-angular-bsb
By Luis Henrique Gomes Camilo
gdg-angular-bsb
- 66