javascript-在AngularJS中深入$watch一个集合
作者:互联网
这个问题已经在这里有了答案: > How to deep watch an array in angularjs? 10个
这是我的对象:
$scope.steps = {
service: {
selected_service: '',
selected_month: '',
selected_year: '',
selected_day: ''
},
payment: {
selected_dd_type: '',
cc: {
selected_card_type: '',
credit_card_number: '',
name_on_card: '',
expiry_month: '',
expiry_year: ''
},
bank_acc: {
bsb_number: '',
account_number: '',
account_holder_name: ''
}
},
agreement: {
agreement_acceptance: false
}
}
这是$watchCollection:
$scope.$watchCollection('steps.service', function(newVal, oldVal) {
$scope.canExit = true;
});
$scope.$watchCollection('steps.payment', function(newVal, oldVal) {
$scope.canExit = true;
}, true);
$scope.$watchCollection('steps.payment.cc', function(newVal, oldVal) {
$scope.canExit = true;
}, true);
$scope.$watchCollection('steps.payment.bank_acc', function(newVal, oldVal) {
$scope.canExit = true;
}, true);
$scope.$watchCollection('steps.agreement', function(newVal, oldVal) {
$scope.canExit = true;
}, true);
一切正常.
必须有更好的方法来监视$scope.steps对象.
如果我$watch步骤,它将无法正常工作.我想Angular看的不够深
$scope.$watchCollection('steps', function(newVal, oldVal) {
$scope.canExit = true;
}, true);
感谢您的指导.
解决方法:
干得好.将值true传递为$watch中的第三个选项:
$scope.$watch('steps', function(newValue, oldValue) {
// callback on deep watch
$scope.canExit = true;
}, true);
另外,请确保在手表内部添加if条件,因为当您将值分配给$scope.steps时,手表也会被触发.
工作示例:
var app = angular.module("sa", []);
app.controller("FooController", function($scope) {
$scope.canExit = false;
$scope.steps = {
service: {
selected_service: '',
selected_month: '',
selected_year: '',
selected_day: ''
},
payment: {
selected_dd_type: '',
cc: {
selected_card_type: '',
credit_card_number: '',
name_on_card: '',
expiry_month: '',
expiry_year: ''
},
bank_acc: {
bsb_number: '',
account_number: '',
account_holder_name: ''
}
},
agreement: {
agreement_acceptance: false
}
};
$scope.reset = function() {
$scope.canExit = false;
}
// Using Math.random() just for demo so that the watch can be invoked
$scope.changeService = function() {
$scope.steps.service.selected_service = Math.random();
}
$scope.changeDate = function() {
$scope.steps.payment.cc.selected_card_type = Math.random();
}
$scope.changeAgreement = function() {
$scope.steps.agreement.agreement_acceptance = Math.random();
}
$scope.$watch('steps', function(newValue, oldValue) {
if (newValue && (newValue !== oldValue)) {
// callback on deep watch
$scope.canExit = true;
}
}, true);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="sa" ng-controller="FooController">
<button ng-click="changeService()">Change service</button>
<button ng-click="changeDate()">Change expiry date</button>
<button ng-click="changeAgreement()">Change agreement</button>
<br>
<br>
<br>Can exit: {{canExit}}
<button ng-click="reset()">Reset</button>
</div>
标签:angularjs,angularjs-scope,watch,javascript 来源: https://codeday.me/bug/20191118/2026272.html