Angularjs 作用域$watch导致无限摘要循环

Angularjs 作用域$watch导致无限摘要循环,angularjs,angularjs-directive,scope,angularjs-scope,Angularjs,Angularjs Directive,Scope,Angularjs Scope,在指令中,我需要查看formData以检查它是否有效,以便启用submit按钮。我在视图中为指令添加了一个属性,该属性已添加到包含formData的指令隔离范围中。我正在使用scope.$watch('questionData',function(){},true)和值true作为第三个参数,就像这样建议我的: //VIEW <question-panel> <form name="grantForm" method="get"

在指令中,我需要查看formData以检查它是否有效,以便启用submit按钮。我在视图中为指令添加了一个属性,该属性已添加到包含formData的指令隔离范围中。我正在使用
scope.$watch('questionData',function(){},true)
和值
true
作为第三个参数,就像这样建议我的:

//VIEW

<question-panel>
    <form name="grantForm" method="get" novalidate>
        <questionnaire-submit-button 
         service="'grantquestions/grant'" 
         question-data="grantForm">
       </questionnaire-submit-button>
    </form>
</question-panel>

//DIRECTIVE

angular.module('ppApp').directive('questionnaireSubmitButton', questionnaireSubmitButton);

questionnaireSubmitButton.$inject = [];

function questionnaireSubmitButton() {

    return {
        restrict: 'E',
        scope: {
            service: '@',
            questionData: '='
        },
        template: '<div data-ng-include="templateUrl"></div>',
        link: function(scope, elem, attr) {
            scope.templateUrl = 'app/templates/directives/' + scope.service.replace(/'/g,'') + '-submit.button.tpl.htm';

            scope.$watch('questionData', function (newValue, oldValue, scope) {
                console.log(newValue, oldValue)
            }, true); //Infinite loop occurs with this scope.watch
        

        }
    }

}
//查看
//指示
角度。模块('ppApp')。指令('questionnaireSubmitButton',questionnaireSubmitButton');
问题重新提交按钮。$inject=[];
函数问题重新提交按钮(){
返回{
限制:'E',
范围:{
服务:“@”,
问题数据:'='
},
模板:“”,
链接:功能(范围、要素、属性){
scope.templateUrl='app/templates/directives/'+scope.service.replace(/'/g',)+'-submit.button.tpl.htm';
范围.$watch('questionData',函数(newValue、oldValue、scope){
console.log(newValue、oldValue)
},true);//此作用域发生无限循环。watch
}
}
}
然而,这将导致一个无限的摘要循环。如果我删除true,它会在初始化时注册,但似乎不会注意表单输入felds的任何更改

我收到了这些错误:

不能复制!不支持复制窗口或作用域实例

已达到10$digest()迭代次数。流产! 在过去5次迭代中激发的观察者:[]

问题


我如何在不引起无限循环的情况下观察指令中形式的任何变化?我正在尝试检查它是否有效。

您可以在任何输入的每次ng更改时使用$scope.$on(从此指令中)和$rootScope.$broadcast(从此指令中),并停止递归地观看(在此指令中)。通常,通过查看的属性启用提交按钮。您可以查看ui验证异步验证并将其应用于每个输入,然后按照george的建议执行操作,并对$invalid/$valid使用直接禁用。它会将您的验证从提交按钮移动到控制器。您必须将ui验证添加到每个ng模型中,但进行相同数量的网络调用,并以几乎相同的方式处理启用的提交。