有這樣的一個需求:新增使用者的時候,根據主鍵判斷當前新增使用者的email是否已經被使用。
為此,我們需要把主鍵和email來傳遞給遠端的一個API,讓API返回結果,告之當前email是否被使用過。
寫一個驗證email唯一性的Directive,頁面大致如下表現:
<input type="text" name="email" class="form-control" data-ng-model="vm.customer.email" data-ng-model-options="{updateOn: 'blur', allowInvalid: true}" data-my-unique data-my-unique-key="{{vm.customer.id}}" data-my-unique-property="email" data-ng-minlength="3" required /> <span class="errorMessage" ng-show="editForm.email.$touched && editForm.email.$error.unique"> Email already in use </span>
以上,data-my-unique-key用來接收主鍵,data-my-unique-property用來接受email這個值。
Directive部分大致如下:
(function(){ var injectParams = ['$q', 'dataService']; var myUniqueDirective = function($q, dataService){ var link = function(scope, element, attrs, ngModel){ ngModel.$asyncValidators.unique = function(modelValue, viewValue){ var deferred = $q.defer(), currentValue = modelValue || viewValue, //獲取主鍵 key = attrs.myUniqueKey,//my-unqiue-key = "{{customer.id}}" //獲取email property=attrs.myUnqiueProperty; //my-unique-property="email" if(key && property){ dataService.checkUniqueValue(key, property, currentValue) .then(function(unique){ if(unique){ deferred.resolve(); } else { deferred.reject(); } }); return deferred.promise; } else { return $q.when(true); } } }; return { restrict: 'A', require: 'ngModel', link: link } }; myUniqueDirective.$inject = injectParams; angular.module('customersApp').directive('myUnique', myUniqueDirective); }());