$scope.$watch のターゲットが現在保持されているのと同じ値に設定された場合、 $scope.$watch がトリガーされないことがわかりました。
動作を示すサンプル JSFiddle ( http://jsfiddle.net/VKHVq/ ) を作成しました。
最初の入力フィールド ( position_total ) に任意の値を入力します。total_before_discountは必要に応じて調整され、total_before_discount $watch もトリガーされます。割引率が 0% であるため、total_discount は常に 0 のままです。ただし、$scope.total_discount には常に 0 が割り当てられますが、残念ながら「total_discount」の監視はトリガーされません。私は何か間違ったことをしていますか、それともこの動作は意図されたものですか?
$watch 関数内で newValue と oldValue を取得し、多くの angular.js $watch の例で見られるように、(newValue === oldValue) {戻る }。
HTML
<div id="container" ng-controller="MyCtrl">
<div>Position total: <input type="number" ng-model="position_total"/>
<div>Total before discount: {{total_before_discount}}</div>
<div>Discount (in %): <input type="number" ng-model="discount"/>
<div>Total discount: {{total_discount}}</div>
<div>Total after discount: {{total_after_discount}}</div>
</div>
JS
var myApp = angular.module('myApp', ['ngAnimate']);
function MyCtrl($scope) {
$scope.position_total = 0;
$scope.total_before_discount = 0;
$scope.discount = 0;
$scope.total_discount = 0;
$scope.total_after_discount = 0;
calculatePositionTotal = function() {
// Dummy method to simulate position calculation
$scope.total_before_discount = $scope.position_total
};
calculateTotalDiscount = function() {
var total_discount = ($scope.total_before_discount / 100) * $scope.discount;
console.log('Going to set total_discount to ' + total_discount);
$scope.total_discount = total_discount;
};
calculateTotalAfterDiscount = function() {
$scope.total_after_discount = $scope.total_before_discount - $scope.total_discount;
};
$scope.$watch('position_total', function (newValue, oldValue) {
calculatePositionTotal();
});
$scope.$watch('total_before_discount', function (newValue, oldValue) {
calculateTotalDiscount();
});
$scope.$watch('discount', function (newValue, oldValue) {
calculateTotalDiscount();
});
$scope.$watch('total_discount', function (newValue, oldValue) {
console.log('total_discount $watch triggered...');
calculateTotalAfterDiscount();
});
}