Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Abra o cmd.
2. Limpe o cache com o comando npm cache clean
3. Instale o angular cli com o comando npm install –g @angular/cli
4. Verifique a versão instalada com o comando ng –v
1. Abra o cmd
2. Se posicione dentro da pasta onde deseja que o projeto seja criado
3. Execute o comando ng new nomeProjeto
1. Abra o cmd.
2. Se posicione dentro da pasta do projeto
3. Execute o comando ng serve
4. Verifique no console o número da porta e no navegador digite o
localhost:numeroPorta
1. Abra o cmd.
2. Execute o comando netstat -a -n -o
3. Identifique o PID conforme porta da aplicação.
4. Em posso do PID execute taskkill -f /pid numeroPID
Instando o bootstrap
1. Abra o cmd.
2. Se posicione dentro da pasta do projeto
3. Execute o comando npm install bootstrap@next –save
Obs., save para informarmos ao projeto que será uma dependência no package.json
Fazendo uso do bootstrap
Criando um component
1. Dentro da pasta src disponibilize uma nova pasta com o nome do módulo
2. Dentro da nova pasta crie o novo arquivo de nome nomeModulo.component.ts
/*
Dizendo que se trata de um component
selector --> tag que será usada pra obtenção do módulo
template --> código html curto incluído no próprio módulo
templateUrl --> código html externo
*/
@Component({
selector: "hello",
template: `
<h2>Hello {{nome}}</h2>
`
})
/*
classe do módulo
export --> declaramos que este módulo estará visivel aos demais
*/
export class HelloComponent {
nome = "Rodrigo";
}
3. Abra o app.module.ts
4. Importe o novo módulo
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
@NgModule({
declarations: [
AppComponent,
/* Declarando o novo componente */
HelloComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Interpolação
Diz-se a junção de muitas saidas, isto é, no angular fazemos a interpolação por meio da
expressão
<div class="form-group">
<label>Nome</label>
<input type="text" class="form-control" (input)="adicionar($event)" >
<input type="text"
class="form-control"
(input)="nome = $event.target.value" >
</div>
<div class="form-group">
<label>Nome</label>
<input type="text" class="form-control" value="{{nome}}" >
</div>
<div class="form-group">
<label>Nome</label>
<input type="text" class="form-control" #nomeInput >
</div>
<button type="button"
class="btn btn-primary"
(click)="adicionar(nomeInput)"
</button>
<button type="button"
class="btn btn-primary"
[disabled]="nome.length == 0" >Adicionar
</button>
<div class="form-group">
<label>Nome</label>
<input type="text" class="form-control" [(ngModel)]="nome" >
</div>
Assim tando o atributo no model será atualizado na interação do input como o value do input
será atualizado no retorno do model.
No exemplo abaixo vamos adicionar e remover uma div de mensagem conforme estado de
uma variável boolean, na ação do clicar processamos e atribuímos a variável o valor true, na
interação com o input esta mesma variável é atribuida com false para reinicialização do fluxo:
[hidden]
<div class="container">
<div class="alert alert-success" role="alert" *ngIf="adicionado">
Funcionário adicionado: <strong>{{nome}}</strong>
</div>
<div class="form-group">
<label>Nome</label>
<input type="text"
class="form-control"
[(ngModel)]="nome"
(focus)="adicionado = false" >
</div>
<button type="button"
class="btn btn-primary"
[disabled]="nome.length == 0"
(click)="adicionar()" >Adicionar</button>
</div>
Diretivas ngfor
Criamos uma lista no component e conforme vamos adicionando a lista é inclementada, com
isto o ngFor vai modificando o dom adicionado novos cards
<div class="form-group">
<label>Nome</label>
<input type="text"
class="form-control"
[(ngModel)]="nome"
(focus)="adicionado = false" >
</div>
<button type="button"
class="btn btn-primary"
[disabled]="nome.length == 0"
(click)="adicionar()" >Adicionar</button>
</div>
Criamos um componente que contem uma div que recebe o objeto funcionario:
<div class="card" >
<img class="card-img-top"
src=""
alt="Card image cap">
<div class="card-block">
{{funcionario.nome}}
</div>
</div>
@Component({
selector: 'app-funcionario-card',
templateUrl: './funcionario-card.component.html',
styleUrls: ['./funcionario-card.component.css']
})
export class FuncionarioCardComponent {
Fazendo uso:
<div class="container">
<div class="alert alert-success" role="alert" *ngIf="adicionado">
Funcionário adicionado: <strong>{{nome}}</strong>
</div>
<div class="form-group">
<label>Nome</label>
<input type="text"
class="form-control"
[(ngModel)]="nome"
(focus)="adicionado = false" >
</div>
<button type="button"
class="btn btn-primary"
[disabled]="nome.length == 0"
(click)="adicionar()" >Adicionar
</button>
</app-funcionario-card>
</div>
</div>
</div>
@Component({
selector: 'app-funcionario-card',
templateUrl: './funcionario-card.component.html',
//styleUrls: ['./funcionario-card.component.css']
styles: [`
.card-block {
text-transform: uppercase;
color: blue;
}
`]
})
export class FuncionarioCardComponent {
Com ngStyle podemos declarar propriedades css na linha ou como retorno do método do
controller:
@Component({
selector: 'app-funcionario-card',
templateUrl: './funcionario-card.component.html',
//styleUrls: ['./funcionario-card.component.css']
styles: [`
.card-block {
text-transform: uppercase;
color: blue;
}
`]
})
export class FuncionarioCardComponent {
getEstiloCartao() {
return {
"border-width" : this.funcionario.id + "px",
"background-color" : this.funcionario.id % 2 === 0 ? "lightblue" :
"lightgreen"
};
}
}
isAdmin() {
return this.funcionario.nome.startsWith("T");
}
Guides – Gera uma linha da abertura até o fechamento da tag para melhor entendimento do
código.
Intellisense for CSS class names – Ao fazer uso de arquivos css traz a lista de estilos para
seleção.
Path Intellisense – Ao fazer import ou seleção de arquivo traz a hierarquia de pastas para fácil
navegação.
Criando diretivas
No exemplo abaixo criamos uma diretiva que altera o fundo do input para amarelo
import { Directive, ElementRef, Renderer2 } from '@angular/core';
@Directive({
selector: '[appCampoColorido]'
})
export class CampoColoridoDirective {
constructor (
private elementoHtml: ElementRef, // Pegando o elemento hospedeiro
private renderer: Renderer2 // Instância do objeto que nos permite
alterar o componente html
) {
this.renderer.setStyle(this.elementoHtml.nativeElement,
'background-color', 'yellow');
}
@HostBinding -> verifica qual componente html esta atrelado a diretiva e altera a cor de
fundo. Exemplo com alteração pelo binding
import { Directive, ElementRef, Renderer2, HostListener, HostBinding }
from '@angular/core';
@Directive({
selector: '[appCampoColorido]'
})
export class CampoColoridoDirective {
constructor () { }
@Directive({
selector: '[appCampoColorido]'
})
export class CampoColoridoDirective {
constructor (
private elementoHtml: ElementRef, // Pegando o elemento hospedeiro
private renderer: Renderer2 // Instância do objeto que nos permite
alterar o componente html
) { }
@Directive({
selector: '[appCampoColorido]'
})
export class CampoColoridoDirective {
@Input() cor;
exportAs -> Serve para exportar a diretiva afim de que usemos em outros cenários, abaixo
testamos no click do button, repare que no input criamos uma variável para recepcionar o
retorno da diretiva e esta mesma variável é usada para nos button para acessar os métodos
import { Directive, ElementRef, Renderer2, HostListener, HostBinding,
Input } from '@angular/core';
@Directive({
selector: '[appCampoColorido]',
exportAs: 'campoColorido'
})
export class CampoColoridoDirective {
@Input() cor;
@HostListener('focus') colorir() {
this.corDeFundo = this.cor;
}
@HostListener('blur') descolorir() {
this.corDeFundo = 'transparent';
}
<div class="form-group">
<label>Nome</label>
<input type="text" class="form-control" [(ngModel)]="nome"
(focus)="adicionado = false" appCampoColorido cor="green"
#campo="campoColorido">
</div>
Usando pipes
Pipes servem para formatar a saída do template, isto é:
{{ dataAniversario | date: ‘dd/MM/y’ }} -> Saída com data formatada pela máscara
informada.
{{ preco | number: ‘1.2-2’ }} -> Saída com número formatado pela máscara informada.
{{ troco | currency }} -> Saída com valor formatado pela moeda nacional.
{{ troco | currency: ‘BRL’:true: ‘1.2-2’ }} -> Saída com valor formatado pela moeda nacional
conforme moeda repassada e máscara.
@Injectable()
export class FuncionarioService {
ultimoId = 1;
funcionarios = [{ id: 1, nome: 'João' }];
adicionar(nome: string) {
const funcionario = {
id: ++this.ultimoId,
nome: nome
};
this.funcionarios.push(funcionario);
console.log(JSON.stringify(this.funcionarios));
}
consultar() {
return this.funcionarios;
}
}
Devemos informar no app.module que temos uma classe de serviço para que o mesmo nos
venha prover quando necessário, para tal cadastramos no providers:
import { FuncionarioService } from './funcionario.service';
import { FuncionarioFormComponent } from './funcionario-form/funcionario-
form.component';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent,
FuncionarioFormComponent
],
imports: [
BrowserModule,
FormsModule
],
providers: [
FuncionarioService
],
bootstrap: [AppComponent]
})
export class AppModule { }
@Component({
selector: 'app-funcionario-form',
templateUrl: './funcionario-form.component.html',
styleUrls: ['./funcionario-form.component.css']
})
export class FuncionarioFormComponent {
constructor(private funcionarioService: FuncionarioService) { }
adicionar(nome: string) {
this.funcionarioService.adicionar(nome);
}
}
Usando polimorfismo nas classes de serviço e injeção de
dependencia
No próximo exemplo teremos uma nova classe de serviço que extends da FuncionarioService
com sobrescrita do método adicionar:
@Injectable()
export class FuncionarioAbrevidoService extends FuncionarioService {
constructor() {
super();
}
adicionar(nome: string) {
super.adicionar(nome.substr(0, 3) + '...');
}
}
Requer que informemos ao no app.module a maneira de prover o serviço, para tal usamos o
atributo useClass:
providers: [
{ provide: FuncionarioService, useClass: FuncionarioAbrevidoService }
]
@Injectable()
export class FuncionarioAbrevidoService extends FuncionarioService {
adicionar(nome: string) {
super.adicionar(nome.substr(0, this.numeroCaracteres) + '...');
}
}
@NgModule({
declarations: [
AppComponent,
FuncionarioFormComponent
],
imports: [
BrowserModule,
FormsModule
],
providers: [
{ provide: FuncionarioService, useFactory: criarFuncionarioService }
],
bootstrap: [AppComponent]
})
export class AppModule { }
@Injectable()
export class LogService {
constructor(
@Inject('LogPrefixo') private prefixo: string
) { }
log(msg: string) {
console.log(`${this.prefixo}: ${msg} `);
}
}
Ensinando o app.module:
providers: [
LogService, { provide: 'LogPrefixo', useValue: 'LOG' }
]
Fazendo uso:
@Component({
selector: 'app-funcionario-form',
templateUrl: './funcionario-form.component.html',
styleUrls: ['./funcionario-form.component.css']
})
export class FuncionarioFormComponent {
constructor(private funcionarioService: FuncionarioService,
private logService: LogService) { }
adicionar(nome: string) {
this.logService.log(`Adicionando ${nome}`);
this.funcionarioService.adicionar(nome);
}
}
@Injectable()
export class FuncionarioService {
ultimoId = 1;
funcionarios = [{ id: 1, nome: 'João' }];
adicionar(nome: string) {
this.logService.log(`Adicionando ${nome}`);
const funcionario = {
id: ++this.ultimoId,
nome: nome
};
this.funcionarios.push(funcionario);
console.log(JSON.stringify(this.funcionarios));
}
consultar() {
return this.funcionarios;
}
}
@Component({
selector: 'app-funcionario-form',
templateUrl: './funcionario-form.component.html',
styleUrls: ['./funcionario-form.component.css'],
providers: [ FuncionarioService ]
})
export class FuncionarioFormComponent {
constructor(private funcionarioService: FuncionarioService { }
adicionar(nome: string) {
this.funcionarioService.adicionar(nome);
}
}