J'utilise ng-options pour sélectionner des valeurs dans un menu déroulant. J'aimerais pouvoir comparer l'ancienne valeur à la nouvelle valeur. ng-change fonctionne bien pour saisir la nouvelle valeur de la liste déroulante, 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, supposons que je souhaite que le contrôleur se connecte: "Votre ancien utilisateur.name était BILL, votre nom d'utilisateur actuel est PHILLIPE."
Avec un angular {{expression}}, vous pouvez ajouter l'ancien utilisateur ou la valeur user.id à l'attribut ng-change en tant que chaîne littérale:
<select ng-change="updateValue(user, '{{user.id}}')"
ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>
Sur ngChange, le premier argument de updateValue sera la nouvelle valeur utilisateur, le second argument sera le littéral formé lors de la dernière mise à jour de la balise select par valeur angulaire, avec l'ancienne valeur user.id.
Aussi, vous pouvez utiliser
<select ng-change="updateValue(user, oldValue)"
ng-init="oldValue=0"
ng-focus="oldValue=user.id"
ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>
Vous pouvez utiliser quelque chose comme ng-change = someMethod ({{user.id}}). En conservant votre valeur dans side {{expression}}, elle évaluera l'expression en ligne et vous donnera la valeur actuelle (valeur avant l'appel de la méthode ng-change).
<select ng-model="selectedValue" ng-change="change(selectedValue, '{{selectedValue}}')">
Conservez simplement une variable currentValue dans votre contrôleur que vous mettez à jour à chaque modification. Vous pouvez ensuite comparer cette valeur à 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 simple variable est la solution la plus simple et la plus logique.
Vous pouvez utiliser une montre scope:
$scope.$watch('user', function(newValue, oldValue) {
// access new and old value here
console.log("Your former user.name was "+oldValue.name+", you're current user name is "+newValue.name+".");
});
https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch
Vous pouvez utiliser une montre à la place, car elle contient 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 le définirais.