Angularjs 角度JS$监视优先于ng更改

Angularjs 角度JS$监视优先于ng更改,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我正在使用Angular JS制作一个注册表,其中一个函数,regishange(),通过ng change执行 我有另一个名为equals的定制指令,它使用$watch检查密码字段,并使用ngModel.$setValidity('equals',password1==password2)设置表单的有效性 理想情况下,每当用户更改其密码字段时,我希望在ng change之前执行equals指令。这使得equals可以在ng change引用表单之前设置表单的有效性 问题是在ng change中

我正在使用Angular JS制作一个注册表,其中一个函数,
regishange()
,通过
ng change
执行

我有另一个名为
equals
的定制指令,它使用
$watch
检查密码字段,并使用
ngModel.$setValidity('equals',password1==password2)
设置表单的有效性

理想情况下,每当用户更改其密码字段时,我希望在
ng change
之前执行
equals
指令。这使得
equals
可以在
ng change
引用表单之前设置表单的有效性

问题是在
ng change
中的函数之前,如何对输入的更改执行
$watch

HTML

  <div class="form-group">
    <label for="register-password1">Password</label>
    <input name="password1" type="password" class="form-control" ng-model="user.password1" required ng-minlength="6" ng-maxlength="20" equals="{{user.password2}}" ng-blur="fieldValidate('password1')" ng-change="regisChange('password1')">
    <div class="error">{{error.password1}}</div>
  </div>

  <div class="form-group">
    <label for="register-password2">Confirm Password</label>
    <input name="password2" type="password" class="form-control" ng-model="user.password2" required equals="{{user.password1}}" ng-blur="fieldValidate('password2')" ng-change="regisChange('password2')">
    <div class="error">{{error.password2}}</div>
  </div>
控制器中的regishange()

$scope.regisChange = function(fieldName){
    console.log($scope.regisForm["password2"].$valid);
    if($scope.regisForm[fieldName].$valid){
      $scope.error[fieldName] = "";
    }
};

一般来说,如果你有两个观察者,D&C都观察Z,最好明确D&C之间的依赖关系,这样你就不会有这些排序问题

我不确定是否有可能保证订购$watch和其他数据绑定事件。但是你可以做一些事情

  • 巩固

    • 将有效性计算移到regishange函数中,而不是使用自定义指令。在这些只检查几个值的简单情况下,这将很容易。这将消除equal指令的$watch处理程序触发和ng change调用regishange之间的竞争条件
  • 始终如一

    • 您使用$watch检查是否相等,但随后依赖事件处理程序清除错误。为什么不同时监视密码值和它们的$valid值(或者只监视整个输入字段),这样您就可以确保在发生更改时运行检查
  • 在我看来,ng变化首先触发是有道理的。它似乎最像一个事件处理程序,我假设它在事件发生后立即启动,而$watch只能在下一个$digest()周期后启动。这就是说,在这种情况下,让ng改变和$watch按你所希望的方式玩可能永远都不干净


    我不太确定代码到底想在redisChange函数中做什么。如果你能用所有相关的位制作一个JSFIDLE,我可能会更有用

    你有控制器或其他东西,还是只有这两个文件?@MaximShoustin嘿,我添加了regishange()的功能。谢谢你看这个嘿,谢谢你的回答。如果你不介意的话,我有一个后续问题。如何在“regishange”函数中而不是在指令中实现“ngModel”的“$setValidity”?我为此创建另一个指令的唯一原因是$setValidity方法,该方法可以更改表单的$valid状态。如果将导入包装在表单中并为所有内容指定名称,则可以访问表单及其$scope上的输入。
    $scope.regisChange = function(fieldName){
        console.log($scope.regisForm["password2"].$valid);
        if($scope.regisForm[fieldName].$valid){
          $scope.error[fieldName] = "";
        }
    };