(function (angular) { "use strict"; var services, $log; angular.module("sysMgrApp").directive("smCodeUniqueValidator", ["ServiceLoader", smCodeUniqueValidator]); /** * smCodeUniqueValidator Directive * @param {} serviceLoader * @returns {Object} */ function smCodeUniqueValidator(serviceLoader) { services = serviceLoader; $log = services.Log.getInstance("smCodeUniqueValidator"); return { require: "ngModel", scope: { primaryKey: "=?", tableName: "@", columnToTest: "@", errorMessage: "=?" }, link: function ($scope, element, attrs, ngModel) { ngModel.$asyncValidators.smCodeUnique = function (modelValue, viewValue) { if (!viewValue) { return true; } let codeObject = { id: $scope.primaryKey, tableName: $scope.tableName, columnToTest: $scope.columnToTest, code: viewValue }; return services.Http.put('api/items/checkCodeUniqueness', codeObject).then( function (response) { if (!response.data.isValid) { $scope.errorMessage = response.data.errorMessage; return services.Deferred.reject(response.data.errorMessage); } return true; } ); }; } }; } })(angular);and this is the HTML - should I try adding ngModel.$touched condition at the very top?
<div class="col-xs-6"> <div class="controls"> <label class="control-label" ng-hide="editRetailTrackingForm.barcode.$dirty && editRetailTrackingForm.barcode.$error"> @Labels.barcode: </label> <div ng-if="editRetailTrackingForm.barcode.$dirty"> <div ng-messages="editRetailTrackingForm.barcode.$error"> <div ng-message="maxlength"> <label class="field-validation-error control-label-error animate-show"> @String.Format(Messages.cannotExceed, Labels.barcode, "100") </label> </div> <div ng-message="smCodeUnique"> <label class="field-validation-error control-label-error animate-show"> {{itemBarcodeErrorMessage}} </label> </div> </div> </div> <div ng-class="{loading:editRetailTrackingForm.barcode.$pending}">@String.Format(Messages.validatingX, Labels.barcode)</div> <input type="text" name="barcode" ng-model="currentItem.barcode" sm-code-unique-validator table-name="items" column-to-test="barcode" error-message="itemBarcodeErrorMessage" primary-key="currentItem.itemId" ng-model-options="{ debounce: { default : 500, blur: 0 }}" class="form-control" ng-maxlength="100" /> </div> </div>