Javascript 为什么$watchGroup要调用它的回调两次?
我有一组需要监视的下拉列表。一旦下拉列表选择了一个未定义的值,即默认值,那么我们应该使用这些值发出ajax请求。我的手表组码在下面Javascript 为什么$watchGroup要调用它的回调两次?,javascript,angularjs,Javascript,Angularjs,我有一组需要监视的下拉列表。一旦下拉列表选择了一个未定义的值,即默认值,那么我们应该使用这些值发出ajax请求。我的手表组码在下面 $scope.$watchGroup([ 'formData.DDL1', 'formData.DDL2', 'formData.DDL3'], function (newValues, oldValues, $currentScope) { // If any of t
$scope.$watchGroup([
'formData.DDL1',
'formData.DDL2',
'formData.DDL3'],
function (newValues, oldValues, $currentScope) {
// If any of the new values are undefined, then do *not* fire a new request
for (var i in newValues) {
if (newValues[i] === undefined)
return;
}
DataService.getData(newValues[0], newValues[1], newValues[2])
.then(function (data) {
$currentScope.data = data;
});
});
<label for="ddl1" class="control-label pull-left">DDL1</label>
<select ng-model='formData.DDL1'
class='form-control'
ng-options='option.id as option.name for option in options'
required
name='DDL1'>
<option value=''>Please select an option.</option>
</select>
不幸的是,由于某些原因,每次我更改下拉列表时,例如,仅选择不同的选项(下面的示例DDL),那么$watchGroup就会调用回调两次。这导致了奇怪的行为,因为$currentScope.data将回调中的数据连接到自身,而不是破坏性的赋值,正如您所看到的那样
显然,$watchGroup在angular 1.3.X中,我目前使用的是1.3.0-rc.1,它仍然是最前沿的,所以我预计会出现一些问题。是否有其他人遇到此问题并/或修复了此问题
为简洁起见,名称已被替换。我认为您的代码应该如下所示: 控制器:
$scope.ddlUpdated = function(){
DataService.getData($scope.formData.DDL1, $scope.formData.DDL2, $scope.formData.DDL3)
.then(function (data) {
$currentScope.data = data;
});
}
视图:
我不会在控制器中使用watch函数,而是在您的3个不同选择中使用
使用watch函数最常用的方法是在自定义指令的link函数中,但您不需要自定义指令,因为Angular已经为我们提供了ngChange指令,该指令可用于通知控制器视图中发生的更改。让我们这样说:在Angular中,控制器通过指令生成在视图中使用的模型,但指令也负责在视图中发生事情时与控制器通信。我没有看到您在$Watch组中的任何位置使用旧值,那么,为什么不去掉$watchGroup并在select中使用ng更改呢?我需要监视多个select,而$watchGroup似乎是最惯用的方法。而且它确实减少了代码重复。oldValues是传入的$watchGroup参数之一,虽然我可以肯定地将其分配给uu,但我决定不这样做:pIt会显示$watch可能在每个$digest循环中被调用多次,因此$watchGroup也是如此。ngChange是一种方式,但为什么会这样呢?有没有办法解决这个问题,或者我总是要使用指令?最常用的方法是在自定义指令的link函数中使用watch函数,在你的例子中,很明显你做的事情比它们应该做的更复杂,因为大多数时候视图中的事件侦听器都应该由指令处理。。。让我们这样说:在Angular中,控制器生成模型,它通过指令在视图中使用,但指令也负责在视图中发生事情时与控制器通信。我希望这会有帮助。它确实有帮助,我只是觉得从控制器中查看表单数据上的3个属性会更容易,而不必为select设置自定义指令。我想是我的错:P
<label for="ddl1" class="control-label pull-left">DDL1</label>
<select ng-model='formData.DDL1'
class='form-control'
ng-options='option.id as option.name for option in options'
required
name='DDL1' ng-change="formData.DDL1 && ddlUpdated()">
<option value=''>Please select an option.</option>
</select>