Em Angular, eu posso ter um formulário que se parece com isso:
<ng-form>
<label>First Name</label>
<input type="text" ng-model="model.first_name">
<label>Last Name</label>
<input type="text" ng-model="model.last_name">
</ng-form>
Dentro do controlador correspondente, eu pude observar facilmente as alterações no conteúdo desse formulário da seguinte forma:
function($scope) {
$scope.model = {};
$scope.$watch('model', () => {
// Model has updated
}, true);
}
Aqui está um exemplo angular no JSFiddle .
Estou tendo problemas para descobrir como realizar a mesma coisa no Angular. Obviamente, não temos mais $scope
$ rootScope. Certamente existe um método pelo qual a mesma coisa pode ser realizada?
Aqui está um exemplo angular no Plunker .
(ngModelChange)="onModelChange($event)"
atributo a cada entrada de formulário para fazer isso?Respostas:
UPD. A resposta e a demonstração são atualizadas para alinhar com o Angular mais recente.
Você pode se inscrever em alterações inteiras do formulário devido ao fato de o FormGroup representar um formulário fornecer
valueChanges
propriedade que é uma instância Observerable:Nesse caso, você precisaria construir o formulário manualmente usando o FormBuilder . Algo assim:
Confira
valueChanges
em ação nesta demonstração : http://plnkr.co/edit/xOz5xaQyMlRzSrgtt7Wn?p=previewfonte
valueChanges
emissor de evento , se essa forma é definida apenas dentro do modelo? Em outras palavras - no construtor de um componente, não é possível obter uma referência a um formulário que foi definido apenas dentro do modelo desse componente e não com a ajuda do FormBuilder?@ViewChild()
. Veja minha resposta atualizada.Se você estiver usando
FormBuilder
, consulte a resposta de @ dfsq.Se você não estiver usando
FormBuilder
, há duas maneiras de ser notificado sobre alterações.Método 1
Conforme discutido nos comentários sobre a pergunta, use uma ligação de evento em cada elemento de entrada. Adicione ao seu modelo:
Então no seu componente:
A página Formulários possui algumas informações adicionais sobre o ngModel que são relevantes aqui:
No seu caso, suponho que você queira fazer algo especial.
Método 2
Defina uma variável de modelo local e defina-a como
ngForm
.Use ngControl nos elementos de entrada.
Obtenha uma referência à diretiva NgForm do formulário usando @ViewChild e assine o ControlGroup do NgForm para obter alterações:
plunker
Para mais informações sobre o Método 2, consulte o vídeo de Savkin .
Consulte também a resposta de @ Thierry para obter mais informações sobre o que você pode fazer com o
valueChanges
observável (como rebater / esperar um pouco antes de processar as alterações).fonte
Para concluir um pouco mais das excelentes respostas anteriores, você precisa estar ciente de que os formulários aproveitam os observáveis para detectar e manipular alterações de valor. É algo realmente importante e poderoso. Mark e dfsq descreveram esse aspecto em suas respostas.
Observáveis permitem não apenas usar o
subscribe
método (algo semelhante aothen
método de promessas no Angular 1). Você pode ir além, se necessário, para implementar algumas cadeias de processamento para dados atualizados em formulários.Quero dizer, você pode especificar nesse nível o tempo de debounce com o
debounceTime
método Isso permite que você aguarde um tempo antes de manipular a alteração e manipular corretamente várias entradas:Você também pode conectar diretamente o processamento que deseja acionar (por exemplo, um assíncrono) quando os valores forem atualizados. Por exemplo, se você quiser manipular um valor de texto para filtrar uma lista com base em uma solicitação AJAX, poderá aproveitar o
switchMap
método:Você vai além, vinculando o observável retornado diretamente a uma propriedade do seu componente:
e exiba usando o
async
pipe:Apenas para dizer que você precisa pensar na maneira de lidar com formas de maneira diferente no Angular2 (uma maneira muito mais poderosa ;-)).
Espero que ajude você, Thierry
fonte
Expandindo as sugestões de Mark ...
Método 3
Implemente a detecção de alterações "profunda" no modelo. As vantagens envolvem principalmente evitar a incorporação de aspectos da interface do usuário no componente; isso também captura as alterações programáticas feitas no modelo. Dito isso, seria necessário um trabalho extra para implementar coisas como a devolução, como sugerido por Thierry, e isso também capturará suas próprias alterações programáticas, portanto, use com cuidado.
Tente em Plunker
fonte
Para
5+
versão angular . Colocar a versão ajuda como angular faz muitas alterações.fonte
Pensei em usar o método (ngModelChange), depois pensei no método FormBuilder e, finalmente, decidi por uma variação do método 3. Isso economiza a decoração do modelo com atributos extras e captura automaticamente as alterações no modelo - reduzindo a possibilidade de esquecer algo com o método 1 ou 2.
Simplificando o método 3 um pouco ...
Você pode adicionar um tempo limite para chamar apenas doSomething () após um número x de milissegundos para simular a rejeição.
fonte