プルダウンから値を選択するのにng-optionsを使用しています。古い値と新しい値を比較したいのですが。 ng-changeはプルダウンの新しい値を取得するためにはうまく機能しますが、どうすれば新しい値と元の値の両方を取得できますか?
<select ng-change="updateValue(user)" ng-model="user.id" ng-options="user.id as user.name for user in users"></select>
たとえば、「以前のuser.nameはBILL、現在のユーザー名はPHILLIPE」というログをコントローラに記録したいとします。
角度{{expression}}を使うと、古いuserまたはuser.idの値をリテラル文字列としてng-change属性に追加できます。
<select ng-change="updateValue(user, '{{user.id}}')"
ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>
NgChangeでは、updateValueの最初の引数は新しいユーザー値になり、2番目の引数はselect-tagが最後にangleによって更新されたときに形成されたリテラルを古いuser.id値にします。
また使用することができます
<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>
Ng-change = someMethod({{user.id}})のようなものを使うことができます。あなたの値を{{expression}}の横に置くことで式をインラインで評価し、あなたに現在の値(ng-changeメソッドが呼ばれる前の値)を与えます。
<select ng-model="selectedValue" ng-change="change(selectedValue, '{{selectedValue}}')">
あなたが変更するたびにあなたが更新するcurrentValue変数をあなたのコントローラに保存するだけです。それを更新する前に毎回それを新しい値と比較することができます。
時計を使うという考えも良いですが、私は単純な変数が最も単純で論理的な解決策であると思います。
あなたはスコープウォッチを使用することができます:
$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
それは新旧の値を持っているので、代わりにwatchを使うことができますが、それからダイジェストサイクルに追加しています。
私はコントローラに2番目の変数を保存して設定します。