angularjs - Hur riktar du in ett omslutet HTML-inmatningsfält med en attributbaserad direktiv som är tillämpad på omslaget?


Jag har en anpassad elementbaserad direktiv (input-field), som omsluter ett standard HTML-input. Jag har också skapat ett attributbaserat valideringsdirektiv (unique-email-validator).

Om jag lägger till den attributbaserade validatorn till den elementbaserade direktiven, när det finns ett valideringsfel, tillämpas ng-invalid-unique-stilarna på input-field-direktivet och inte på själva HTML-inputfältet. Detta hindrar mina ng-messages från att visas korrekt.

Hur gör jag så att unique-email-validator tillämpas på det omslutna inmatningsfältet?

Anpassat inmatningsfält med unik e-postvärdesattribut tillämpat

<input-field unique-email-validator name="emailAddress" ng-required="true" ng-disabled="context.isReadonly" ng-model="context.selectedSection.model.emailAddress" content-key="LABEL_EMAIL" ></input-field>

Anpassad inmatningsdirektiv

module Components.Controls {
"use strict";

export class InputField implements angular.IDirective {

    restrict = "E";
    scope = {
        name: "@",
        currentValue: "=ngModel",
        contentKey: "@",
        disabled: "=ngDisabled",
        required: "=ngRequired"
    };
    replace =true;

    template = "<label translate=\"{{::contentKey}}\"></label><span ng-if=\"required\">*</span><input name=\"{{name}}\" ng-model=\"currentValue\" ng-disabled=\"disabled\" ng-required=\"required\" />";

    static factory(): angular.IDirectiveFactory {
        let directive = () => {
            return new InputField();
        };


        return directive;
    }
}

angular.module("components.controls")
    .directive("inputField", InputField.factory());
}

Attributbaserad e-postvalidator

module Components.Controls {
"use strict";

export class UniqueEmailValidator implements angular.IDirective {
  restrict = "A";
  require = "ngModel";

   link = (scope, element, attrs, ngModel) => {
     let q = this.$q;

     ngModel.$asyncValidators.unique = function (modelValue, viewValue) {
       let deferred = q.defer();
       setTimeout(function () {

         if (viewValue === "[email ") {
           deferred.reject();
           console.log("rejecting!");
         }
         else {
           deferred.resolve();
           console.log(viewValue + " is unique");
         }
       }, 1000);

       return deferred.promise;
     }
   }

   constructor(private $q: angular.IQService) {

   }

   static factory(): angular.IDirectiveFactory {

     let directive = ($q) => {
       return new UniqueEmailValidator($q);
     };

     directive.$inject = ["$q"];

     return directive;
   }
}

  angular.module("components.controls")
    .directive("uniqueEmailValidator", UniqueEmailValidator.factory());
}