我在一個有很多驗證的表單上有一個字段。如何在Angular中基於一個http調用進行多個驗證
起初,我把它組織成了多個指令,每個指令都有自己的錯誤信息。
但是,驗證使用後端異步調用,所以突然之間我爲同一個數據服務器創建了5個http調用。我試圖弄清楚如何更有效地寫這個。
我想知道是否有可能有一個$async
驗證程序調用dataservice,而多個常規$validators
內部的第一個異步函數在.then
之後。我對此進行了實驗,但它似乎完全沒有達到嵌套$validators
。
我也嘗試在服務中調用一次,但是我不知道如何在字段上的modelValue發生更改時更新它,並因此將信息傳遞給相應的驗證指令。我可以將它作爲服務中的異步驗證並將響應附加到指令查找的範圍嗎?
TLDR;
如何進行一個http調用並基於返回的數據執行多個驗證檢查,每個驗證檢查都有自己的錯誤?
FOR EXAMPLE
我有大約四個指令,所有看起來像這樣:
angular.module('validationForField').directive('po', ['$q', '$sce', '$timeout', 'myService', function ($q, $sce, $timeout, myService) {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, elem, attrs, ctrl, ngModel) {
ctrl.$asyncValidators.validateField = function (modelValue) {
var def = $q.defer();
myService.httpcall(modelValue)
.then(function (response, modelValue) {
if (response.data.status === "Error") {
return def.reject();
}
def.resolve();
}).catch(function(){
def.reject();
});
return def.promise;
}
}
}
}]);
每個人都有不同的分析數據,返回不同的錯誤信息。每個人都打電話給myService.httpcall,結果是多餘的,因爲他們都獲得相同的數據。
我試圖做
angular.module('validationForField').directive('po', ['$q', '$sce', '$timeout', 'myService', function ($q, $sce, $timeout, myService) {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, elem, attrs, ctrl, ngModel) {
ctrl.$asyncValidators.validateField = function (modelValue) {
var def = $q.defer();
myService.httpcall(modelValue)
.then(function (response, modelValue) {
if (response.data.status === "Error") {
return def.reject();
}
ctrl.$validators.checkStatus = function (response) {
if (response.data.data.status === "10"){
return false
}
ctrl.$validators.checkPermissions = function (response) {
return response.data.data.permission){
}
def.resolve();
}).catch(function(){
def.reject();
});
return def.promise;
}
}
}
}]);
這種方式存在的主要異步驗證爲HTTP調用是否成功與否,當它返回
您可以製作一個小提琴或垃圾箱,或者至少分享與您的問題相關的部分代碼! – mamsoudi
@ mamos98有幫助嗎? – jenryb