Angular 2 - Cadastro de Clientes - XII
Neste artigo vou mostrar como criar um cadastro de clientes e fazer o CRUD usando o Angular 2 e o Visual Studio Code. |
Neste artigo vamos exibir os dados de um cliente selecionado no formulário de detalhes, e, para fazer isso vamos usar o DataBinding do Angular 2. (link do artigo anterior)
O Data
binding ou vinculação de dados é a sincronização de dados entre os componentes
do modelo e da view. Para exibir a propriedade de um componente, você pode colocar
seu nome no template da view, usando a interpolação, ou seja, incluído-o em chaves
duplas {{}}.
Neste contexto podemos ter a vinculação de dados de uma única via
conhecido como one-way databinding e a vinculação de dados de duas
vias conhecido como two-way databinding.
No one-way databinding a vinculação de dados que segue o sentido do
componente para o template pode ser feito usando as chaves duplas {{valor}}
ou o Property Binding (binding de propriedade)
[propriedade]="valor";
a vinculação que segue o sentido do template para o componente pode ser
feita usando o Event Binding (binding de evento) :
(evento)="handler".
1- Interpolação :
<div>{{cliente.nome}}</div>
: exibe na tela os dados do atributo
contido entre chaves duplas ‘{{ }}’.
2- Binding de
propriedade : <div [gravar]="gravar"></div> :
que associa um valor para
uma variável visível no escopo do Angular 2.
3- Binding de evento
: <button (click)="salvar()">Salvar</button> :
utilizado para adicionar uma ação a um
elemento como clicar em um
botão e chamar um método.
|
A ligação de dados bidirecional, o two-way databinding, funde a
vinculação de propriedades e de eventos numa única notação utilizando a diretiva
ngModel.
Assim, combinando os bindings de evento e de propriedade obtemos o two-way Databinding: <input [(ngModel]) = "cliente.nome" >
Com o two-way databinding temos a sincronização bidirecional, e assim, sempre que o valor for alterado quer seja no componente ou no template ele será sincronizado e atualizado em ambos os lados.
Aplicando o one-way databinding usando interpolação {{}}
Para você perceber na prática a diferença vamos iniciar aplicando o one-way databinding para exibir os dados do cliente selecionado no formulário de detalhes.
Vamos abrir o arquivo cliente-detalhe.componente.html e usar a interpolação, ou seja, as chaves duplas {{ }}, para exibir os valores de forma unidirecional. Nessa abordagem temos que o fluxo vem do componente para o template:
Altere o código do arquivo incluindo o código na cor azul como mostrado a seguir:
<div class="container">
<h2>Salvar Cliente</h2>
<form>
<div class="form-group">
<label for="nome">Nome</label>
<input type="text" class="form-control" placeholder="Informe o nome" value="{{cliente.nome}}">
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" placeholder="Informe o email" value="{{cliente.email}}">
</div>
<div class="form-group">
<label for="telefone">Telefone</label>
<input type="text" class="form-control" placeholder="Informe o telefone" value="{{cliente.telefone}}">
</div>
<button type="submit" class="btn btn-success">Salvar</button>
<a class="btn btn-secondary" routerLink="/">Voltar </a>
</form>
</div>
|
Ao salvar as alterações no arquivo o BrowserSync irá atualizar a aplicação e podemos selecionar um cliente e ver os seus dados agora exibidos no formulário de detalhes:
Nessa abordagem estamos obtendo o valor de um atributo da nossa classe ClienteDetalheComponent definida no arquivo cliente-detalhe.component.ts e exibindo em nosso template, o arquivo cliente-detalhe.componente.html . Assim os dados estão sendo apenas exibidos e estão no formato somente leitura.
Qualquer alteração feita no template não será refletida no componente.
Para
mostrar isso, poderíamos usar o event binding, criando um botão de
comando no template e definindo um evento Click para que o usuário possa
interagir com a aplicação.
Ex: <button (click)="alterar()" class="btn
btn-warning"></button>
Aplicando o one-way databinding usando o property binding
Vamos agora aplicar o property binding ao nosso template para mostrar outra forma de one-way databinding.
Abra o arquivo cliente-detalhe.componente.html e inclua o código conforme destacado em azul abaixo:
<div class="container">
<h2>Salvar Cliente</h2>
<form>
<div class="form-group">
<label for="nome">Nome</label>
<input type="text" class="form-control" placeholder="Informe o nome" [value]="cliente.nome">
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" placeholder="Informe o email" [value]="cliente.email">
</div>
<div class="form-group">
<label for="telefone">Telefone</label>
<input type="text" class="form-control" placeholder="Informe o telefone" [value]="cliente.telefone">
</div>
<button type="submit" class="btn btn-success">Salvar</button>
<a class="btn btn-secondary" routerLink="/">Voltar </a>
</form>
</div>
|
Aqui teremos o mesmo resultado obtido quando usamos a interpolação e os dados estão vindo do componente para o template.
Aplicando o two-way data binding
Vamos agora aplicar o two-way databinding e assim permitir a sincronização de dados entre o componente e o template. Nessa abordagem qualquer alteração no componente se refletir no template e vice-versa.
Para poder usar o two-way databinding temos que importar o módulo FormsModule no arquivo cliente.module.ts. O FormsModule fornece diretivas e componentes relacionados aos formulários.
Abra o arquivo cliente.module.ts e inclua o código em azul abaixo:
import { ClienteRoutingModule } from './cliente-routing.module';
import { ClienteService } from './cliente.service';
import { FormsModule} from '@angular/forms';
@NgModule({
imports : [
CommonModule,
ClienteRoutingModule,
FormsModule
],
declarations : [
ClientesListaComponent,
ClienteDetalheComponent
],
exports : [ ClientesListaComponent],
providers: [
ClienteService
]
})
export class ClientesModule {}
|
Agora no arquivo cliente-detalhe.componente.html defina o código em azul como mostrado a seguir:
<div class="container">
<h2>Salvar Cliente</h2>
<form>
<div class="form-group">
<label for="nome">Nome</label>
<input type="text" class="form-control" placeholder="Informe o nome"
name="nome"
[ngModel]="cliente.nome"
(ngModelChange)="cliente.nome = $event" >
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" placeholder="Informe o email"
name="email"
[ngModel]="cliente.email"
(ngModelChange)="cliente.email = $event" >
</div>
<div class="form-group">
<label for="telefone">Telefone</label>
<input type="text" class="form-control" placeholder="Informe o telefone"
name="telefone"
[ngModel]="cliente.telefone"
(ngModelChange)="cliente.telefone = $event" >
</div>
<button type="submit" class="btn btn-success">Salvar</button>
<a class="btn btn-secondary" routerLink="/">Voltar </a>
</form>
</div>
|
Neste código precisamos definir o atributo name do formulário definindo o nome de cada campo do formulário. Sem fazer isso o Angular 2 vai emitir um erro.
A seguir estamos atualizando o template usando o property binding com o ngModel e assim estamos atualizando o template a partir do componente.
Depois estamos usando o event binding do NgModel, o ngModelChange, para atualizar o componente a partir do template, ou seja, quando o usuário fizer alguma alteração no template, o angular emite um evento interno, que será o valor do campo, e assim o evento vai atualizar o valor do componente.
Temos assim o two-way databinding funcionando conforme mostrar o exemplo abaixo:
Observe que selecionamos um cliente e no formulário de detalhes alteramos os dados do cliente e ao retornar vemos que as alterações atualizaram o componente; temos assim o two-way databinding.
Para concluir vamos melhorar o código do nosso template, o arquivo cliente-detalhe.componente.html alterando o seu código como mostrado abaixo:
<div class="container">
<h2>Salvar Cliente</h2>
<form>
<div class="form-group">
<label for="nome">Nome</label>
<input type="text" class="form-control" placeholder="Informe o nome"
name="nome"
[(ngModel)]="cliente.nome" >
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" placeholder="Informe o email"
name="email"
[(ngModel)]="cliente.email" >
</div>
<div class="form-group">
<label for="telefone">Telefone</label>
<input type="text" class="form-control" placeholder="Informe o telefone"
name="telefone"
[(ngModel)]="cliente.telefone" >
</div>
<button type="submit" class="btn btn-success">Salvar</button>
<a class="btn btn-secondary" routerLink="/">Voltar </a>
</form>
</div>
|
Como você percebeu simplificamos o código mesclando o property binding e o event binding em uma sintaxe mais simples.
[ngModel]="cliente.nome" (ngModelChange)="cliente.nome = $event" |
==> | [(ngModel)]="cliente.nome" |
Agora temos o two-way databinding funcionando usando o ngModel na sintaxe simplificada. Como estamos usando um serviço com dados em memória a atualização é automática.
No próximo artigo vamos continuar mostrando como incluir um novo cliente.
Respondeu Jesus, e disse-lhes: Ainda que
eu testifico de mim mesmo, o meu testemunho é verdadeiro, porque sei de onde
vim, e para onde vou; mas vós não sabeis de onde venho, nem para onde vou.
Vós julgais segundo a carne; eu a ninguém julgo.
E, se na verdade julgo, o meu juízo é verdadeiro, porque não sou eu só, mas eu e
o Pai que me enviou.
João 8:14-16
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
NET - Criando um livro de contatos usando o AngularJS - Macoratti
NET - AngularJS : Apresentação (início do curso) - Macoratti
ASP .NET MVC - Crud com Entity Framework e AngularJS - Macoratti
AngularJS - Conceitos Básicos - YouTube (série de 13 vídeo aulas sobre o Angular)
NET - O que é TypeScript e quais os seus benefícios - Macoratti
TypeScript - Configurando o VS Community 2015 para ... - Macoratti
Visual Studio - Bem-Vindo Node.js : desenvolvendo para Node.js na plataforma .NET