Dans Angular, je pourrais avoir une forme qui ressemble à ceci:
<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>
Dans le contrôleur correspondant, je pourrais facilement surveiller les modifications du contenu de ce formulaire comme ceci:
function($scope) {
$scope.model = {};
$scope.$watch('model', () => {
// Model has updated
}, true);
}
Voici un exemple angulaire sur JSFiddle .
J'ai du mal à comprendre comment accomplir la même chose dans Angular. De toute évidence, nous n'avons plus $scope
, $ rootScope. Il existe certainement une méthode par laquelle la même chose peut être accomplie?
Voici un exemple angulaire sur Plunker .
(ngModelChange)="onModelChange($event)"
attribut à chaque entrée de formulaire afin d'accomplir cela?Réponses:
UPD. La réponse et la démo sont mises à jour pour s'aligner sur le dernier Angular.
Vous pouvez vous abonner à des modifications de formulaire entières car FormGroup représentant un formulaire fournit une
valueChanges
propriété qui est une instance observable :Dans ce cas, vous devrez créer un formulaire manuellement à l'aide de FormBuilder . Quelque chose comme ça:
Découvrez
valueChanges
en action dans cette démo : http://plnkr.co/edit/xOz5xaQyMlRzSrgtt7Wn?p=previewla source
valueChanges
émetteur d'événements d' un formulaire si ce formulaire est défini uniquement dans le modèle? En d'autres termes - dans le constructeur d'un composant, n'est-il pas possible d'obtenir une référence à un formulaire qui a été défini uniquement dans le modèle de ce composant et non avec l'aide de FormBuilder?@ViewChild()
. Voir ma réponse mise à jour.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:
Puis dans votre composant:
La page Formulaires contient des informations supplémentaires sur ngModel qui sont pertinentes ici:
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:
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).la source
Pour compléter un peu plus de bonnes réponses précédentes, vous devez être conscient que les formulaires utilisent des observables pour détecter et gérer les changements de valeur. C'est quelque chose de vraiment important et puissant. Mark et dfsq ont tous deux décrit cet aspect dans leurs réponses.
Les observables permettent non seulement d'utiliser la
subscribe
méthode (quelque chose de similaire à lathen
méthode des promesses dans Angular 1). Vous pouvez aller plus loin si nécessaire pour implémenter certaines chaînes de traitement des données mises à jour dans les formulaires.Je veux dire que vous pouvez spécifier à ce niveau le temps anti-rebond avec la
debounceTime
méthode. Cela vous permet d'attendre un certain temps avant de traiter le changement et de gérer correctement plusieurs entrées:Vous pouvez également brancher directement le traitement que vous souhaitez déclencher (certains asynchrones par exemple) lorsque les valeurs sont mises à jour. Par exemple, si vous souhaitez gérer une valeur de texte pour filtrer une liste en fonction d'une requête AJAX, vous pouvez tirer parti de la
switchMap
méthode:Vous allez même plus loin en liant l'observable retournée directement à une propriété de votre composant:
et affichez-le à l'aide du
async
tube:Juste pour dire que vous devez penser à la manière de gérer les formulaires différemment dans Angular2 (une manière beaucoup plus puissante ;-)).
J'espère que ça t'aide, Thierry
la source
Élargissement des suggestions de Mark ...
Méthode 3
Implémentez la détection des changements "profonds" sur le modèle. Les avantages consistent principalement à éviter d'incorporer des aspects d'interface utilisateur dans le composant; cela prend également en compte les modifications programmatiques apportées au modèle. Cela dit, cela nécessiterait un travail supplémentaire pour implémenter des choses telles que le debouncing comme suggéré par Thierry, et cela capturera également vos propres changements programmatiques, donc utilisez avec prudence.
Essayez dans Plunker
la source
Pour la
5+
version angulaire . Mettre la version aide car angulaire fait beaucoup de changements.la source
J'ai pensé à utiliser la méthode (ngModelChange), puis j'ai pensé à la méthode FormBuilder, et j'ai finalement opté pour une variante de la méthode 3. Cela évite de décorer le modèle avec des attributs supplémentaires et prend automatiquement les modifications du modèle - réduisant la possibilité d'oublier quelque chose avec la méthode 1 ou 2.
Simplifier un peu la méthode 3 ...
Vous pouvez ajouter un délai pour n'appeler doSomething () qu'après x nombre de millisecondes pour simuler le debounce.
la source