2017-07-14 65 views
-1

我試圖通過使用自定義指令來實現異步驗證。AngularJS - 插入自定義指令後,表單變爲無效

這是指令

moduloArea.directive('uniqueName', function($http, $q) { 
    return { 
     require : 'ngModel', 
     link: function($scope, element, attrs, ngModel) { 
      ngModel.$asyncValidators.nombre = function(modelValue, viewValue) { 
       return $http.get('/checkUsernameAvailability/'+viewValue).then(
        function(response) { 
         if (!response.data.validUsername) { 
          return $q.reject(response.data.errorMessage); 
         } 
         return true; 
        } 
       ); 
      }; 
     } 
    }; 
}); 

結果在控制檯

console result when the username is typed

正如你可以看到當用戶名輸入的回報的JSON對象,因爲此用戶名已經拿了。

但是,在插入僞指令unique-name時,HTML格式爲$ invalid。

<form name="registerUsernameForm" novalidate="novalidate"> 
    <input type="text" name="username" data-ng-model="person.userName" data-unique-name="" required="required"/> 
    <span data-ng-show="registerUsernameForm.username.$error.uniqueName">This username is already taken.</span>   
    <button type="submit" data-ng-disabled="registerUsernameForm.$invalid || registerUsernameForm.$pending" data-ng-click="registerPerson(person)"> Save Person </button> 
</form> 

我使用的數據唯一的名稱=「」(=「」),因爲如果我不那麼thymeleaf生成以下錯誤:

Attribute name "data-unique-name" associated with an element type "input" must be followed by the ' = ' character.

你這是什麼認爲可能是錯誤的?

回答

1

您正在驗證nombre不是uniqueName。出於這個原因,uniqueName仍然保持無效。

moduloArea.directive('uniqueName', function($http, $q) { 
    return { 
     require : 'ngModel', 
     link: function($scope, element, attrs, ngModel) { 
      ngModel.$asyncValidators.uniqueName= function(modelValue, viewValue) { 
       var value = modelValue || viewValue; 
       return $http.get('/checkUsernameAvailability/'+value).then(
        function resolved(response) { 
         if (response.data && !response.data.validUsername) { 
          return $q.reject(response.data.errorMessage); 
         } 
         return true; 
        }, function rejected() { 
         //username does not exist, therefore this validation passes 
         return true; 
} 
       ); 
      }; 
     } 
    }; 
}); 
+0

感謝的人,像我8.我真的有這種小白,我從失去你能解釋一下這個指令對我「功能解決(響應)」開始。 – wilson

+1

已解決僅僅是清除代碼的名稱。你可以設置你想要的。 $ http promise基本上有2個回調。首先是成功,第二個可以看到一個錯誤。當休息API返回2XX狀態,這意味着它是成功的。 4XX是客戶端錯誤,5XX是服務器錯誤。即,如果名稱不存在,則可以拋出錯誤。這意味着驗證成功。 –