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

时间:2014-10-01 13:54:41

标签: javascript angularjs

我有一组需要监控的下拉列表。一旦下拉列表选择了一个未定义的值(即默认值),那么我们应该使用这些值触发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处于角度1.3.X(我目前正在使用1.3.0-rc.1),这仍然是最前沿的,所以我期待一些问题。有没有其他人遇到过这个问题和/或修复过它?

为简洁起见,已更换名称。

1 个答案:

答案 0 :(得分:0)

我认为你的代码应该是这样的:

控制器:

$scope.ddlUpdated = function(){
    DataService.getData($scope.formData.DDL1, $scope.formData.DDL2, $scope.formData.DDL3)
                .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' ng-change="formData.DDL1 && ddlUpdated()">
        <option value=''>Please select an option.</option>
    </select>

我不会使用&#34;手表功能&#34;在控制器中,我会改为使用{3}中的ngChange directive而不是selects

最常用的使用方法&#34; watch&#34;函数在自定义指令的链接函数内部,但您不需要为此设置自定义指令,因为Angular已经为我们提供了ngChange指令,该指令可用于通知控制器具有的更改发生在视图中。让我们这样说吧:在Angular中,控制器生成在视图中通过指令消耗的模型,但指令也负责在事情发生时与控制器进行通信。 #34;在视图中。