«нет поставщика» для пользовательской директивы валидации Angular 6 на основе шаблона? - PullRequest
0 голосов
/ 13 марта 2019

Я следую документации по https://angular.io/guide/form-validation#custom-validators

Я добавил директиву в свой проект, используя ng generate

import { Directive} from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms';

@Directive({
  selector: '[appForbiddenRisInternalIdValidator]',
  providers: [{provide: NG_VALIDATORS, useExisting: 'ForbiddenRisInternalIdValidatorDirective', multi: true}]

})
export class ForbiddenRisInternalIdValidatorDirective implements Validator {

  validate(control: AbstractControl): ValidationErrors {
    console.log('Validating');
    return null;
  }

}

, которая также добавила ее в мой app.module.как я и ожидал.

 import { ForbiddenRisInternalIdValidatorDirective } from './validators/forbidden-ris-internal-id-validator.directive';


@NgModule({
  declarations: [
    AppComponent,
   ..........,
    ForbiddenRisInternalIdValidatorDirective
  ],

Документация теперь просто говорит, чтобы сделать эту работу, мне просто нужно добавить селектор в форму, и что часть директивы провайдера добавит этот валидатор в список валидаторов, которые будутзапустите мою форму.

Я пробовал это в своем теге формы.

<form #RBoxAddEdit='ngForm' (submit)='updateBox(RBoxAddEdit)' appForbiddenRisInternalIdValidator>

Я также пробовал это непосредственно во вводе, к которому я пытаюсь добавить проверку.

 <input appForbiddenRisInternalIdValidator #customValidation = 'ngModel' maxlength="45" id="risinternalId"  name="risnternalId" matInput  required [(ngModel)]='boxEdit.risinternalId' placeholder="RIS ID (RBXXXX)">

Однако, куда бы я ни добавил это, я получаю нулевую ошибку инжектора.

ERROR Error: StaticInjectorError(AppModule)[ForbiddenRisInternalIdValidatorDirective]: 
  StaticInjectorError(Platform: core)[ForbiddenRisInternalIdValidatorDirective]: 
    NullInjectorError: No provider for ForbiddenRisInternalIdValidatorDirective!

Кажется, я что-то упустил.Есть идеи, что я пропустил?

1 Ответ

1 голос
/ 13 марта 2019

Значение в поле useExisting должно быть токеном вместо string.

Попробуйте изменить это:

@Directive({
  selector: '[appForbiddenRisInternalIdValidator]',
  providers: [{
    provide: NG_VALIDATORS,
    useExisting: 'ForbiddenRisInternalIdValidatorDirective',
    multi: true
  }]
})
export class ForbiddenRisInternalIdValidatorDirective implements Validator { ...
}

на это:

@Directive({
  selector: '[appForbiddenRisInternalIdValidator]',
  providers: [{
    provide: NG_VALIDATORS,
    useExisting: ForbiddenRisInternalIdValidatorDirective,
    multi: true
  }]
})
export class ForbiddenRisInternalIdValidatorDirective implements Validator { ...
}

Без ''


Вот Рабочий образец StackBlitz для вашей ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...