Snippets para Angular e TypeScript.
<h5>Lista de cursos</h5>
<ul>
<li *ngFor="let curso of cursos">
{{ curso }}
</li>
</ul>
import { CursosService } from './cursos.service';
export class CursosComponent implements OnInit {
cursos: string[] = [];
cursosService: CursosService;
ou
//cursosService: CursosService;
constructor(_cursosService: CursosService) {
this.cursosService = _cursosService;
}
ou
constructor(private cursosService: CursosService) {
//this.cursosService = _cursosService;
}
ngOnInit() {
this.cursos = this.cursosService.getCursos();
}
}
import { Injectable } from '@angular/core';
// Decorator para injetar a classe
@Injectable()
export class CursosService {
getCursos() {
return ['Angular 2', 'Java', 'Phonegap'];
}
}
Lembrando que, a classe de serviço deverá ser informado no app.module dentro de providers: [].
Tem como objetivo, passar conteúdos variáveis para um componente.
<ng-content></ng-content>
<app-exemplo-ng-content>
Conteúdo
</app-exemplo-ng-content>
Para passarmos mais de um valor, podemos atribuir a propriedade select e selecionarmos o que queremos passar.
<ng-content select=".titulo"></ng-content>
<ng-content select=".corpo"></ng-content>
<div class="titulo">
<h1>Título do painel</h1>
</div>
<div class="corpo">
<p>Corpo do painel</p>
</div>
Funciona como o if da programação convencional, porém a diretiva *ngIf não contém um else.
<divc *ngIf="cursos.lenght > 0">
Lista de cursos:
</div>
No exemplo acima, a div somente será exibida caso o nosso array de cursos contenha algum elemento.
export class DiretivaNgIfComponent implements OnInit {
cursos: string[] = [];
}
<divc [hidden]="cursos.lenght > 0">
Lista de cursos:
</div>
O comportamento será o mesmo, porém, poupando o DOM de ser modificado.
Existem várias formas de se fazer, todas retornarão o mesmo resultado.
$ cd NomeProjeto
$ ng build --target=development --environment=dev
$ ng build --dev --e=dev
$ ng build --dev
$ ng build
$ cd NomeProjeto
$ ng build --target=production --environment=prod
$ ng build --prod --env=prod
$ ng build --prod
Ao gerar um novo projeto, o cli do Angular já possui suporte para três pré-processadores:
$ ng new meu-projeto --style=sass
$ ng new meu-projeto --style=less
$ ng new meu-projeto --style=stylus
Caso o projeto já tenha sido criado, para alterar a extensão da folha de estilo:
$ ng set defaults.styleExt scss
$ ng set defaults.styleExt less
$ ng set defaults.styleExt styl
Instalação e criação de projetos: ng new, ng init e ng serve
$ npm install -g angular-cli
$ ng new NomeProjeto
$ cd NomeProjeto
$ ng serve
$ ng generate component meu-primeiro-component
ou
$ ng g c meu-primeiro-component
$ ng generate service meu-primeiro-servico
ou
$ ng g s meu-primeiro-servico
- Component = $ ng g component meu-component
- Service = $ ng g service meu-servico
- Directive = $ ng g directive minha-diretiva
- Pipe = $ ng g pipe meu-pipe
- Class = $ ng g class minha-classe
- Interface = $ ng g interface minha-interface
- Enum = $ ng g enum meu-enum
Ao digitar uma informação em um campo input, o evento será disparado.
Junta-se um binding de propriedade e um binding de evento [] + () = [(ngModel)]
<input type="text" [(ngModel)]="pessoa.nome">
<input type="text" [(ngModel)]="pessoa.idade">
<p>Meu nome é {{ pessoa.nome}} e tenho {{ pessoa.idade}} anos de idade.</p>
export class DataBindingComponent implements OnInit {
pessoa: any = {
nome: 'Luan',
idade: 25
}
}
<p>Selecione uma classe</p>
<select #classe (change)="0">
<option value="alert-succes">Sucesso</option>
<option value="alert-info">Info</option>
<option value="alert-warning">Alerta</option>
<option value="alert-danger">Erro</option>
</select>
Após o evento 'onchange' ocorrer, o Angular irá fazer uma verifição
[class.alert-sucess] | Colchetes pois é um Style/Propery Binding e irá adicionar a classe "alert-sucess"="classe.value" | Irá fazer uma comparação com o value da variável que definimos== 'alert-sucess' valor que será comparado com o value da variável que definimos<div class="alert"
[class.alert-sucess]="classe.value == 'alert-sucess'">
Sucesso
</div>
<div class="alert">Info</div>
<div class="alert">Alerta</div>
<div class="alert">Erro</div>
Também podemos criar a mesma mecânica utilizando a Interpolação.
<div class="alert {{ classe.value }}">
Texto colorido conforme valor do combobox.
</div>
Podemos também, utilizar da mesma mecânica para controlar comportamentos de styles.
<div class="alert"
[style.display]="classe.value == 'alert-danger' ? 'block' : 'none'">
Esse texto somente aparece em caso de erro.
</div>
Qual a diferença entre ter várias instâncias das classes de serviços e ter apenas uma instância que seria o padrão "Singleton" para toda a aplicação.
Referência: https://www.youtube.com/watch?v=R3lU_qFsPlg
<h5>Lista de cursos</h5>
<ul>
<li *ngFor="let curso of cursos">
{{ curso }}
</li>
</ul>
import { CursosService } from './cursos.service';
export class CursosComponent implements OnInit {
cursos: string[] = [];
cursosService: CursosService;
constructor() {
this.cursosService = new CursosService();
}
ngOnInit() {
this.cursos = this.cursosService.getCursos();
}
}
export class CursosService {
getCursos() {
return ['Angular 2', 'Java', 'Phonegap'];
}
}
<p highlight [defaultColor]="'grey'" [highlightColor]="'red'">
Texto com highlight com cores customizadas.
</p>
@import { Directive, HostListener, HostBinding, Input } from '@angular/core';
@Directive({
selector: '[highlight]'
})
export class HighlightDirective {
@HostListener('mouseenter') onMouseOver(){
this.backgroundColor = this.highlightColor;
}
@HostListener('mouseleave') onMouseLeave(){
this.backgroundColor = this.defaultColor;
}
@HostBinding('style.backgroundColor') background: string;
// Variáveis para cores dinâmicas
@Input() defaultColor: string = 'white';
@Input() highlightColor: string = 'yellow';
constructor() {}
}
<p highlightMouse>
Texto com highlight quando passo o mouse.
</p>
import { Directive, HostListener, HostBinding, ElementRef, Rendeder } from '@angular/core';
@Directive({
selector: '[highlightMouse]'
})
export class HighlightMouseDirective {
@HostListener('mouseenter') onMouseOver() {
this.backgroundColor = 'yellow';
}
@HostListener('mouseleave') onMouseLeave() {
this.backgroundColor = 'white';
}
//Host Binding
@HostBinding('style.backgroundColor') backgroundColor: string;
constructor(){}
}
Criando uma diretiva de atributo customizada:
Criar uma diretiva para manipular o DOM.
ng g d nome-da-diretiva
<p appFundoAmarelo>
Texto com fundo amarelo
</p>
import { Directive, Renderer } from '@angular/core'
@Directive ({
selector: '[appFundoAmarelo]'
})
expor class NomeDaDiretiva {
constructor(
private _renderer: Renderer,
private _elementRef: ElementRef
) {
this._renderer.setElementStyle(
this._elementRef.nativeElement,
'background-color',
'yellow'
);
}
}
Tem como objetivo, fazer a verificação de um objeto é ou não nulo, de forma simples e objetiva.
export class OperadorElvisComponent implements OnInit {
tarefa {
desc: 'Descrição da tarefa',
responsavel: {
usuario: null
}
};
}
<p>Responsável: {{ tarefa.responsavel?.usuario?.nome }}</p>
É uma alternativa para escrevermos um código menor, do que se utilizarmos class binding.
export class ngClassComponent implements OnInit {
meuFavorito: boolean = false;
onClick() {
this.meuFavorito = !this.meuFavorito;
}
}
<h1>
<i class="glyphicon"
[ngClass]="{
'glyphicon-star-empty': !meuFavorito,
'glyphicon-star': meuFavorito
}"
(click)="onClick()">
</i>
</h1>
É uma diretiva que permite que iteremos um array através de um loop for.
export class ngForComponent implements OnInit {
cursos: string[] = string["Angular","Ruby"];
}
Fazemos a iteração com let e não com var, pois é uma convenção do ES6.
<ul>
<li *ngFor="let curso of cursos">
{{ curso }}
</li>
</ul>
Para receber o índice de cada elemento, faremos da seguinte maneira.
<ul>
<li *ngFor="let curso of cursos, let i = index">
{{ i + 1 }} - {{ curso }}
</li>
</ul>
Funciona como o switch da programação convencional.
<nav>
<a [class.active]="aba == 'home'"
(click)="aba = 'home'">Home</a>
<a [class.active]="aba == 'dashboard'"
(click)="aba = 'dashboard'">Dashboard</a>
<a [class.active]="aba == 'campanhas'"
(click)="aba = 'campanhas'">Campanhas</a>
</nav>
Abaixo utilizamos o Switch no formato de Property Binding, pois o elemento será ficar escutando as mudanças de status conforme a página onde estivermos.
<div [ngSwitch]="aba">
<p *ngSwitchCase="'dashboard'">Conteúdo da Dashboard</p>
<p *ngSwitchCase="'campanhas'">Conteúdo das Campanhas</p>
<p *ngSwitchDefault>Conteúdo da Home</p>
</div>
É uma forma de passar instruções para o template.
Interagem com a view e modificam a estrutura do DOM e/ou código HTML. (*ngFor, *ngIf).
Elas não modificam a estrutura do DOM, mas elas interagem com o elemento que foram aplicadas. (ng-class, ng-style)
ng lint - Fazer o lint do nosso código, escanear e verificar por boas práticas. (ex: Ponto e virgulando faltando)
$ ng lint
ng test - Executar os testes unitários
$ ng test
ng e2e - Testes e2e protector
$ ng e2e
Acessar campos e/ou valores da view através de ViewChield
<input type="text" [value]="valor" #campoInput>
import { Component, OnInit, Input, ElementRef } from '@angular/core';
export class DataBindingComponent implements OnInit {
@ViewChield('campoInput') campoValorInput: ElementRef;
}
Emitir eventos customizados através do Output Properties. (Ex: contador com + input -)
<div>
<button class="btn btn-primary" (click)="decrementa()">-</button>
<input type="text" [value]="valor" readonly>
<button class="btn btn-primary" (click)="incrementa()">+</button>
</div>
export class Component1Component implements OnInit {
decrementa(){
this.valor--;
}
incrementa(){
this.valor++;
}
}
Dessa forma, o component filho escuta e realiza toda a operação, porém, queremos que o nosso component pai também possa escutar o evento e então fazer alguma ação.
export class Component1Component implements OnInit {
@Output mudouValor = new EventEmitter();
}
Declarar uma variável do tipo Emissor de Eventos, e o angular tem uma classe chamada de EventEmitter responsável por isso.
import { Component, OnInit, Input, EventEmitter } from '@angular/core';
Devemos importar essa propriedade 'EventEmitter' na chamada do nosso Core.
incrementa(){
this.valor++;
this.mudouValor.emit({ novoValor: this.valor });
}
decrementa(){
this.valor--;
this.mudouValor.emit({ novoValor: this.valor });
}
E emitiremos essa mudança de valor nos nossos métodos já criados.
<contador (mudouValor)="onMudouValor($event)"></contador>
Passar valores de um componente para outro, através das inputs properties.
<app-curso [nome]="nomeDoCurso"></app-curso>
export class Component1Component implements OnInit {
nomeDoCurso: string = 'Angular';
}
import { Component, OnInit, Input } from '@angular/core';
export class Component2Component implements OnInit {
@Input('nome') nomeDoCurso: string = '';
ou
@Input() nome: string = '';
}
Ao digitar uma informação em um campo input, o evento será disparado.
<input type="text"
[ngModel]="nome"
(ngModelChange)="nome = $event"
>
export class DataBindingComponent implements OnInit {
nome: string = 'Luan Dantas';
}
Junta-se um binding de propriedade e um binding de evento [] + () = [(ngModel)]
<input type="text" [(ngModel)]="nome">
<p>Você digitou: {{ nome }}</p>
export class DataBindingComponent implements OnInit {
nome: string = 'Luan Dantas';
}
Escutar eventos no HTML do Template e executar lógica de programação no Componente
Ao clicar no botão, será executada uma função criada em nosso component.
<button (click)="botaoClicado()" class="btn btn-primary">
Me clique!
</button>
export class DataBindingComponent implements OnInit {
botaoClicado(){
alert = "O botão foi clicado!"
}
}
Ao pressionar uma tecla, será executada uma função criada em nosso component.
<input type="text" (keyup)="onKeyup($event)" />
<p>Valor atual: {{ valorAtual }}</p>
export class DataBindingComponent implements OnInit {
valorAtual: string = '';
onKeyUp(evento: KeyBoardEvent) {
this.valorAtual = (<HTMLInputElement>evento.target).value;
}
}
Ao pressionar a tecla ENTER, será executada uma função criada em nosso component.
<input type="text" #campoInput (keyup.enter)="salvarValor(campoInput.value)" />
<p>Valor salvo: {{ valorSalvo }}</p>
export class DataBindingComponent implements OnInit {
valorSalvo: string = '';
salvarValor(valor){
this.valorSalvo = valor;
}
}
<img [src]="urlImg">[attr.cospan]export class DataBindingComponent implements OnInit {
urlImagem = "http://lorempixel.com/400/200/nature/"
}
<img [src]="urlImagem" >
export class DataBindingComponent implements OnInit {
nome: string = "Luan Dantas"
getValor(){
return 2;
}
}
<p>{{ nome }}</p>
<p>Resultado de 1 + 1 é {{ getValor() }}</p>