Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么$watchGroup要调用它的回调两次?_Javascript_Angularjs - Fatal编程技术网

Javascript 为什么$watchGroup要调用它的回调两次?

Javascript 为什么$watchGroup要调用它的回调两次?,javascript,angularjs,Javascript,Angularjs,我有一组需要监视的下拉列表。一旦下拉列表选择了一个未定义的值,即默认值,那么我们应该使用这些值发出ajax请求。我的手表组码在下面 $scope.$watchGroup([ 'formData.DDL1', 'formData.DDL2', 'formData.DDL3'], function (newValues, oldValues, $currentScope) { // If any of t

我有一组需要监视的下拉列表。一旦下拉列表选择了一个未定义的值,即默认值,那么我们应该使用这些值发出ajax请求。我的手表组码在下面

    $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>