O que é vinculação de dados bidirecional no Angular
A vinculação de dados bidirecional no Angular permite que os dados fluam do componente para a exibição e vice-versa. Ele é usado para exibir informações para o usuário final e permite que ele faça alterações nos dados subjacentes usando a interface do usuário. Isso faz uma conexão bidirecional entre a visualização (o modelo) e a classe de componente que já mencionamos. O processo é semelhante à associação bidirecional no WPF.
How does data binding work in Angular?
Angular vinculação de dados funciona sincronizando os dados nos componentes angulares com a interface do usuário. Dessa forma, ele sempre pode mostrar o valor atual dos dados. Em termos de vinculação bidirecional, a sincronização automática de dados acontece entre o Model e a View, mantendo ambos sincronizados o tempo todo. Por causa disso, qualquer alteração feita no Modelo também é refletida imediatamente na Vista. E vice-versa – as alterações feitas na Vista também são atualizadas no Modelo. A associação de dados bidirecional no Angular é usada para exibir informações para o usuário final e permite que o usuário final faça alterações nos dados subjacentes usando a interface do usuário. Isso faz uma conexão bidirecional entre a exibição (o modelo) e a classe de componente. Isso é semelhante à associação bidirecional no WPF.
Uma associação unidirecional está pegando o estado de nossa classe de componente e exibindo-o em nossa exibição. Vejamos este código:
<input #myTitle (keyup)="keyup(myTitle.value)">
<h2>{{ text }}</h2>
export class SampleComponent implements OnInit {
text = 'default value';
keyup(value) {
this.text = value;
}
...
Aqui estamos simplesmente usando interpolation
para vincular a propriedade text ao HTML. Isso exibirá o valor da propriedade text na interface do usuário. O input
elemento manipula a interação do usuário e atualiza a propriedade subjacente text
por meio da interface do usuário usando a associação de eventos. Essencialmente, a entrada faz o oposto da ligação unidirecional, ela pega as informações da interface do usuário e atualiza a propriedade na classe do componente. O método que está conectado ao evento keyup da entrada atualiza a propriedade text sempre que o evento ocorre. Depois que o valor da propriedade text é alterado pelo método de evento, essa alteração é refletida na interface do usuário pela associação unidirecional usando interpolation
o elemento h2. Portanto, se o usuário digitar algo no elemento de entrada, isso atualizará imediatamente o texto h2 - esse comportamento é basicamente uma simulação de uma ligação bidirecional. O mesmo também pode ser obtido no WPF usando uma associação unidirecional e um manipulador de eventos keyup, mas a associação bidirecional é muito mais conveniente de usar.
How to implement two-way data binding in Angular
Felizmente, podemos implementar a lógica da amostra acima de uma maneira muito mais fácil e é aqui que entra a ligação bidirecional!
A direção de uma associação bidirecional não é apenas a classe de componente para a interface do usuário, mas também a interface do usuário para a classe de componente. Para o conseguir, vamos utilizar uma directiva chamada ngModel
. Vamos atualizar o exemplo acima com a ngModel
diretiva. A sintaxe para isso é - um colchete aberto seguido por um parêntese aberto e, claro, o parêntese e colchete de fechamento correspondentes. Isso é chamado de banana na caixa, então vamos vê-lo em ação!
<input [(ngModel)]="text">
<h2>{{ text }}</h2>
E as associações equivalentes no WPF seriam:
<TextBox Text="{Binding Path=Text, Mode=TwoWay}"></TextBox>
<TextBlock Text="{Binding Path=Text, Mode=OneWay}"></TextBlock>
A ligação Angular é uma questão de sintaxe e, no WPF, é mais como uma configuração - em particular o valor de Binding.Mode
.
Se executarmos este código, ocorrerá um erro no console - dizendo que o ngModel
é uma propriedade desconhecida do elemento de entrada. Isso se deve ao fato de que, para usar a ngModel
diretiva, é necessário importar o FormsModule
. Ele precisa ser importado para o app.module.ts
arquivo:
import { FormsModule } from '@angular/forms';
...
@NgModule({
imports: [
BrowserModule,
FormsModule
]
...
Se executarmos o exemplo, o valor da entrada inicial será igual ao valor padrão, que é o text
valor da propriedade. Como a entrada é editável, alterar seu valor refletirá sobre o elemento h2 imediatamente. Portanto, digitar na entrada atualiza a text
propriedade e, em seguida, o elemento h2 exibe esse valor por meio do interpolation
.
Outra maneira equivalente de conseguir isso é:
<input [ngModel]="text" (ngModelChange)="text = $event">
Na verdade, isso é semelhante ao primeiro exemplo, que usou uma associação de propriedade e uma associação de evento.
Additional Resources
- Desktop para Web: Desktop para Web: Angular associação bidirecional com ngModel
- Vinculação unidirecional em Angular
- Angular NgModel