我會稍有懷疑你是否需要該指令作爲一個完整的黑盒子。首先,通常您需要一些驗證消息或一些向用戶顯示的有關無效數據的不同情況的信息,因此僅僅驗證者的真/假返回值是不夠的。其次,你還重新創建的很多事情已經角讓你與ngForm
,ngModel
,ngModelController
和input
指令,特別是ngModelController
的$setValidity
功能我會把每個校驗器在其自己的指令,require
小號ngModel
:一個用於電子郵件,另一個用於密碼。儘管如此,您仍然可以從整體控制器傳遞選項,但每個指令都是根據所需信息量身定製的。例如,validationEmail
指令可以接受使用的現有的郵件的數組:
<input validation-email validation-email-used="usedEmails" ng-model="data.email" type="text" placeholder="Email" name="email" ng-required />
哪裏usedEmails
是電子郵件的陣列。該指令可以寫成:
app.directive('validationEmail', function() {
return {
require: 'ngModel',
scope: {
validationEmailUsed:'='
},
link: function(scope, element, attributes, ngModelController) {
scope.$watch(function() {
return ngModelController.$viewValue
}, function(email) {
// Test the email and call
// ngModelController.$setValidity(...)
// to set the validity of the email
});
}
};
});
您可以在modified version of your Plunker
編輯看到這個動作:如果要與服務器端驗證,一旦所有客戶端驗證已經從通過整合指令,可以從傳遞給ngSubmit
表單上功能做到這一點:
<form name="myForm" ng-submit="submit()">
可使用的形式將自己暴露於範圍的事實進行編碼時,其所有ngModel
控制器(用於相同的例如,使用$timeout
,而不是調用$http
或服務),
$scope.submit = function() {
$timeout(function() {
$scope.myForm.username.$setValidity('available',false);
$scope.myForm.email.$setValidity('emailFree',false);
},500);
}
與這樣的一個問題是,你再會要標記的輸入爲有效用戶改變後。您可以創建一個validOnChange
指令,將用作:
<input ng-model="data.username" type="text" placeholder="Username" name="username" valid-on-change="available" ng-required />
,並編寫了如:
app.directive('validOnChange', function() {
return {
require: 'ngModel',
scope: '',
link: function(scope, element, attributes, ngModelController) {
scope.$watch(function() {
return ngModelController.$viewValue
}, function() {
ngModelController.$setValidity(attributes.validOnChange,true);
});
}
}
});
你可以see this in this Plunker。
使用ngForm和ngModelController的另一個一般好處是,它根據輸入的錯誤/有效狀態向窗體和元素添加了很多類,並在範圍中顯示錯誤狀態,所以您可以例如,使用ngIf
可輕鬆顯示/隱藏錯誤消息。
這很好,但我仍然覺得我不想驗證,直到我點擊提交。就可伸縮性而言,這種方法還不夠好,想象一下,如果字段是有效的,我希望明天檢查我的後端,我不想每次輸入時都要驗證,但當我點擊提交時。所以我的問題是,在Angular中,點擊提交時可能觸發該操作? – DreaMTT
此外,使用您的解決方案,我不能使用指令來自定義輸入,我將需要。我試着編輯你的plunkr,使用嵌套的指令,但不知何故,我無法與驗證內部輸入溝通。如果你可以檢查一下,並擺脫一些ligth,我會很感激它:http://plnkr.co/edit/DB0a3rjaRhKk7NV4dt5v?p =預覽非常感謝您的幫助! – DreaMTT
@DreaMTT我已經修改了我的答案,顯示瞭如何在表單通過客戶端驗證並從指令中提交給服務器之後仍然可以設置有效性。 –