Mam następujący niestandardowy walidator, który pracuje zgodnie z oczekiwaniami bez problemów.

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

    validate(control:AbstractControl):ValidationErrors|null {
       return  control.value == '-1' ? {'defaultSelected':true} : null;
    }   
}

Kiedy usuwam tablicę dostawców z Testvaludatordional i umieścić go do app.module.ts jak poniżej, nie działa.

.....
providers: [
      { provide: NG_VALIDATORS, useExisting:TestValidatorDirective, multi:true}
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Czy ktoś może mi wyjaśnić to zachowanie, jestem trochę zdezorientowany.

0
rematnarab 21 luty 2019, 09:14

2 odpowiedzi

Najlepsza odpowiedź

Nie ma potrzeby poruszania się walidatora do AppModule. Aby móc używać swojego walidatora, gdziekolwiek chcesz, wystarczy upewnić się, że jest w module declarations.

Token NG_VALIDATORS jest wtryskiwany do każdej kontroli formularza przez kątową. Gdy niniejsza dyrektywa określa coś w sekcji providers, dodaje się do tego tokena wtryskowego dla , że Pole.

Więc nie jest jak dodanie usługi do sekcji {X0}} ... W tym przypadku nie powinno być w module.

Ale twój moduł powinien umożliwić wykorzystanie dyrektywy, więc musi dodać dyrektywę do deklaracji:

@NgModule({
  //...
  delcarations: [
    TestValidatorDirective
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Jest dobry artykuł myśli, który obejmuje ten temat naprawdę dobrze: https://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html

1
Matt Tester 21 luty 2019, 06:51

Próbować:

.....
declaration : [
   TestValidatorDirective , < -- add here
   //... other components
 ],
bootstrap: [AppComponent]
})

export class AppModule { }

Dyrektywy są zadeklarowane pod declarations i nie providers

0
Shashank Vivek 21 luty 2019, 06:50