在AngularJS中深度监视一个集合。
在AngularJS中深度监视一个集合。
以下是我的对象:\n
$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 } }
\n以下是`$watchCollection`的用法:\n
$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);
\n一切运行正常。\n一定有更好的方法来监视`$scope.steps`对象。\n如果我监视`steps`,它不会起作用。我猜Angular不能深层次地进行监视。\n
$scope.$watchCollection('steps', function(newVal, oldVal) { $scope.canExit = true; }, true);
\n感谢您的指导。
在AngularJS中,当我们需要监视一个集合的变化时,可以使用$watch来实现。但是,使用$watch会带来性能上的问题,因此有其他更好的解决方法。
首先,我们可以使用$watch传入一个函数作为参数。在这个函数中,我们可以进行所需的所有检查,并返回计算后的值。然后,我们可以在$watch的第二个参数中处理新值。例如:
$watch( function(){ var calculatedVal = /*进行所有所需的检查*/; return calculatedVal; }, function(newVal){ $scope.canExit = true; } );
另一种更好的选择是完全避免使用$watch,而是使用事件或回调函数,例如ng-change。这种方法更加高效和易于阅读。
在AngularJS中,如果我们想要深度监控一个集合,即使集合中的属性发生变化,也能触发相应的回调函数,我们可以使用$watch方法,并将第三个参数设置为true。例如,我们可以使用以下代码来进行深度监控:
$scope.$watch('steps', function(newValue, oldValue) { // callback on deep watch $scope.canExit = true; }, true);
同时,为了避免在给$scope.steps赋值时也触发$watch,我们需要在$watch函数中添加条件判断。例如:
$scope.$watch('steps', function(newValue, oldValue) { if (newValue && (newValue !== oldValue)) { // callback on deep watch $scope.canExit = true; } }, true);
在上面的例子中,$watch方法会监控$scope.steps的变化,并在发生变化时触发回调函数。通过判断newValue和oldValue是否相等,我们可以确定集合中的属性是否发生了变化。
另外,需要注意的是,$watchCollection方法并不支持第三个参数,因此在$watchCollection中传递第三个参数并不会产生任何效果。根据官方文档的说明,$watchCollection只会浅层监控对象的属性,因此无法满足我们的需求。
以上就是在AngularJS中实现深度监控集合的方法和原因。希望对您有所帮助!