web-dev-qa-db-fra.com

ng-change obtient une nouvelle valeur et une valeur originale

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."

109
Bailey Smith

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.

262
db-inf

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>
14
Umut Catal

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}}')">
13
Vivek Panday

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.

12
TGH

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

8
tommybananas

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.

2
user12121234