gpt4 book ai didi

angularjs - 在异步验证器 promise 待处理时考虑表单无效

转载 作者:行者123 更新时间:2023-12-03 13:28:24 24 4
gpt4 key购买 nike

我有一个异步验证器:

app.directive('validateBar', ['$http', function($http) {
function link($scope, $element, $attrs, ngModel) {
ngModel.$asyncValidators.myValidator = function(value) {
return $http.get('/endpoint/' + value);
};
}
return {
require: 'ngModel',
link: link
};
}]);

表格模板:
<form name="myForm" ng-submit="foo.$valid && saveForm()">
<input name="bar" ng-model="bar" data-validate-bar>
<p ng-show="myForm.bar.$error.myValidator">Your bar is wrong</p>
<button disabled="myForm.$invalid">
</form>

问题:我希望我的随附表格无效,而 myValidator promise 待定。

我知道在异步验证器挂起时使表单无效的两种方法,但它们既冗长又/或笨拙。
// Workaround 1: Mark another validator as invalid while the validator promise is pending.
// I cannot mark 'myValidator' as invalid, gets set to valid immediately by Angular.
app.directive('validateSomething', ['$http', function($http) {
function link($scope, $element, $attrs, ngModel) {
ngModel.$setValidity('async', false);
ngModel.$asyncValidators.myValidator = function(value) {
return $http.get('/endpoint/' + value).then(function() {
ngModel.$setValidity('async', true);
});
};
}
return {
require: 'ngModel',
link: link
};
}]);
<!-- Workaround 2: Prevent submitting through the UI -->
<form name="myForm" ng-submit="myForm.$valid && !myForm.$pending && saveForm()">
<input name="bar" ng-model="bar" data-validate-bar>
<p ng-show="myForm.bar.$error.myValidator">Your bar is wrong</p>
<button disabled="myForm.$invalid || myForm.$pending">
</form>

我不喜欢解决方法 1,因为我将另一个验证器 ( async ) 标记为无效,这可能会产生意想不到的副作用,我不喜欢解决方法 2,因为我不再信任 form.$valid通过它自己。

有谁知道一个干净的解决方案?

最佳答案

您可以使用 $pending测试某个异步验证器是否在整个表单或特定输入元素上挂起。我还在 $pristine 上添加了一个测试在页面加载和使用时隐藏错误消息ng-disabled而不是 disabledbutton .

<form name="myForm" ng-submit="foo.$valid && saveForm()">
<input name="bar" ng-model="bar" data-validate-bar>
<div ng-show="! myForm.$pristine">
<p ng-show="myForm.bar.$pending.myValidator || myForm.bar.$error.myValidator">Your bar is wrong</p>
</div>
<button ng-disabled="myForm.$invalid || myForm.$pending">Do smth</button>
</form>

关于angularjs - 在异步验证器 promise 待处理时考虑表单无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26978671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com