Si vous utilisez FormBuilder
, consultez la réponse de @ dfsq.
Si vous n'utilisez pas FormBuilder
, il existe deux façons d'être notifié des modifications.
Méthode 1
Comme indiqué dans les commentaires sur la question, utilisez une liaison d'événement sur chaque élément d'entrée. Ajoutez à votre modèle:
<input type="text" class="form-control" required [ngModel]="model.first_name"
(ngModelChange)="doSomething($event)">
Puis dans votre composant:
doSomething(newValue) {
model.first_name = newValue;
console.log(newValue)
}
La page Formulaires contient des informations supplémentaires sur ngModel qui sont pertinentes ici:
L' événement ngModelChange
n'est pas un <input>
élément. Il s'agit en fait d'une propriété événementielle de la NgModel
directive. Lorsque Angular voit une cible de liaison dans le formulaire [(x)]
, il s'attend à ce que la x
directive ait une x
propriété d'entrée et une xChange
propriété de sortie.
L'autre bizarrerie est l'expression du modèle, model.name = $event
. Nous avons l'habitude de voir un $event
objet provenant d'un événement DOM. La propriété ngModelChange ne produit pas d'événement DOM; c'est une EventEmitter
propriété Angular qui renvoie la valeur de la zone de saisie lorsqu'elle se déclenche.
Nous préférons presque toujours [(ngModel)]
. Nous pourrions diviser la liaison si nous devions faire quelque chose de spécial dans la gestion des événements, comme l'anti-rebond ou la limitation des touches.
Dans votre cas, je suppose que vous voulez faire quelque chose de spécial.
Méthode 2
Définissez une variable de modèle locale et définissez-la sur ngForm
.
Utilisez ngControl sur les éléments d'entrée.
Obtenez une référence à la directive NgForm du formulaire à l'aide de @ViewChild, puis abonnez-vous au ControlGroup de NgForm pour les modifications:
<form #myForm="ngForm" (ngSubmit)="onSubmit()">
....
<input type="text" ngControl="firstName" class="form-control"
required [(ngModel)]="model.first_name">
...
<input type="text" ngControl="lastName" class="form-control"
required [(ngModel)]="model.last_name">
class MyForm {
@ViewChild('myForm') form;
...
ngAfterViewInit() {
console.log(this.form)
this.form.control.valueChanges
.subscribe(values => this.doSomething(values));
}
doSomething(values) {
console.log(values);
}
}
plunker
Pour plus d'informations sur la méthode 2, voir la vidéo de Savkin .
Voir aussi la réponse de @ Thierry pour plus d'informations sur ce que vous pouvez faire avec l' valueChanges
observable (comme le débouncing / attendre un peu avant de traiter les changements).