J'utilise ng-options pour sélectionner des valeurs dans une liste déroulante. J'aimerais pouvoir comparer l'ancienne valeur à la nouvelle valeur. ng-change fonctionne bien pour saisir la nouvelle valeur du menu déroulant, mais comment puis-je obtenir à la fois la nouvelle valeur et la valeur d'origine?
<select ng-change="updateValue(user)" ng-model="user.id" ng-options="user.id as user.name for user in users"></select>
Par exemple, disons que je voulais que le contrôleur enregistre, "Votre ancien nom d'utilisateur était BILL, votre nom d'utilisateur actuel est PHILLIPE."
angularjs
ng-options
Bailey Smith
la source
la source
Réponses:
Avec une {{expression}} angulaire, vous pouvez ajouter l'ancienne valeur user ou user.id à l'attribut ng-change sous forme de chaîne littérale:
Sur ngChange, le 1er argument de updateValue sera la nouvelle valeur utilisateur, le 2ème argument sera le littéral qui a été formé lors de la dernière mise à jour de la balise select par angular, avec l'ancienne valeur user.id.
la source
user
appel de la méthode in est celui deng-model
, et non de ng-options (peut être trompeur). Espérons que cette solution élégante fonctionnera également dans les futures versions d'angular :)user.id
est numérique ... cela ne fonctionnera pas s'iluser.id
s'agit d'une chaîne ou d'un guidVous pouvez également utiliser
la source
Vous pouvez utiliser quelque chose comme ng-change = someMethod ({{user.id}}). En gardant votre valeur de côté {{expression}}, il évaluera l'expression en ligne et vous donnera la valeur actuelle (valeur avant l'appel de la méthode ng-change).
la source
Gardez simplement une variable currentValue dans votre contrôleur que vous mettez à jour à chaque changement. Vous pouvez ensuite comparer cela à la nouvelle valeur à chaque fois avant de la mettre à jour. '
L'idée d'utiliser une montre est également bonne, mais je pense qu'une variable simple est la solution la plus simple et la plus logique.
la source
Vous pouvez utiliser une montre à lunette:
https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch
la source
Vous pouvez utiliser une montre à la place, car elle a l'ancienne et la nouvelle valeur, mais vous ajoutez ensuite au cycle de résumé.
Je garderais juste une deuxième variable dans le contrôleur et la définirais.
la source
$watch
se déclenche à chaque fois que la variable change. Les observateurs augmentent la complexité et sont enclins à créer des cycles de mise à jour lorsque le code modifie leurs valeurs.