Angularjs 角度JS$监视优先于ng更改
我正在使用Angular JS制作一个注册表,其中一个函数,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中
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值(或者只监视整个输入字段),这样您就可以确保在发生更改时运行检查
我不太确定代码到底想在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] = "";
}
};