2017-10-13 50 views
0

在我的控制,我用的输入很多的,以产生一个新的页面(如JSON文件)完成所有填写检查大形式 。我通过一个对象$scope.validation手动收集输入验证。例如:

if (!$scope.title) { 
    $scope.validation.title.error = true; 
} 

然后,当缺少或需要更改某些内容时,我会显示适当的内容。我正在检查它:

if ($scope.validation.title.error) { /* and many more here */ 
    $scope.formValid = false; // form is invalid if at least one error occurred 
} 

我的一个输入收集链接(URL)到其他页面。

<div ng-repeat="parent in parents"> 
    <input ng-model="parent.url" placeholder="URL" type="text" /> 
</div> 

之后,我需要检查是否存在这些页面。我这样做的方式是:

$http.get(url).then((res)=>{ 
    /* page exists */ 
    $scope.validation.parents.error = false; 
}. (err)=>{ 
    /* page doesn't exists */ 
    $scope.validation.parents.error = true; 
}); 

(其实这是在一个循环中发生的事情,所以异步响应更慢)

,因为它需要等待数据的到来,它无法及时检查$scope.validation.parents.error以及其他验证。

如何异步检查这个值,以便像这样工作的:

if ($scope.validation.title.error || /* and many more here */ 
    $scope.validation.parents.error) { 
    $scope.formValid = false; 
} 


这类页面验证的任何替代的想法被接受

+0

异步验证与['$ asyncValidators' API(HTTPS完成。组织/ API/NG /类型/ ngModel.NgModelController#$ asyncValidators)。 – georgeawg

+0

@georgeawg,我对此并不熟悉,因为我正在进行手动验证(检查页面是否存在等)。我不知道这是否会对我有帮助 –

回答

0

异步验证与$asyncValidators API完成。

从文档:

$asyncValidators

被期望执行异步验证(例如,HTTP请求)验证的集合。提供的验证功能预期会在模型验证过程中运行时返回承诺。一旦交付承诺,验证状态将在满足时设置为true,否则为false。当异步验证器被触发时,每个验证器将并行运行,并且只有在所有验证器都满足后才会更新模型值。只要异步验证器未完成,其密钥将被添加到控制器$pending属性中。而且,所有异步验证器只有在所有同步验证器都通过后才会运行。

请注意,如果使用$ http,那么服务器返回成功的HTTP响应代码以满足验证和状态级别4xx以拒绝验证非常重要。 //docs.angularjs:

ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) { 
    var value = modelValue || viewValue; 

    // Lookup user by username 
    return $http.get('/api/users/' + value). 
    then(function resolved() { 
     //username exists, this means validation fails 
     return $q.reject('exists'); 
    }, function rejected() { 
     //username does not exist, therefore this validation passes 
     return true; 
    }); 
}; 

— AngularJS ngModelController API Reference - $asyncValidators

有关更多信息,请参阅AngularJS Developer Reference - Custom Validation

+0

我正在验证ng-click =在控制器中“检查()”。 $ asyncValidators在指令中使用,每次输入一个字母(要检查的URL)时调用$ http.get()。它看起来并不是我所需要的,除非在check()函数调用之后有一种方法在控制器中使用它。 –