forme - Validator personalizat Angular2 nu este apelat


Am scris o directivă de validare personalizată astfel:

const DURATION_VALIDATOR = new Provider(
    NG_VALIDATORS,
    {useExisting: forwardRef(() => DurationDirective), multi: true}
);


@Directive({
    selector: '[ngModel][duration], [formControl][duration]',
    providers: [{
        provide: NG_VALIDATORS,
        useExisting: forwardRef(() => DurationDirective),
        multi: true }]
})
export class DurationDirective  implements Validator{
    constructor(public model:NgModel){
        console.error('init')
    }
    validate(c:FormControl) {
        console.error('validate')
        return {'err...':'err...'};
    }
}

HTML-ul meu arată astfel:

<input 
    type="text"
    [(ngModel)]="preparation.duration"
    duration 
    required
>

Problema mea este că, în timp ce validatorul este inițializat, adică 'init' este afișat în consolă, funcția validate nu este niciodată apelată, adică 'validate' nu este niciodată afișat în consolă, atunci când tastez în câmpul de input. Deoarece validatorul este inițializat, presupun că am conectat totul corect. Deci ce lipsește?

Răspuns #1

Cea mai bună presupunere a mea este că nu ați inițializat Angular în ceea ce privește formularele:

import { App } from './app';
import { disableDeprecatedForms, provideForms } from '@angular/forms';

bootstrap(App, [
    // these are crucial
    disableDeprecatedForms(),
    provideForms()
  ]);

Poți vedea acest plunk - acesta afișează "validate" în consolă.

Răspunsul #2

Am bifurcat și am îmbunătățit plunk-ul lui @batesiiic: https://plnkr.co/edit/Vokcid?p=preview

validate(c:FormControl) {
    console.error('called validate()')
    return parseInt(c.value) < 10 ? null : {
      duration: {message: 'Please enter a number < 10'}
    };
}

Metoda validate() trebuie să returneze null dacă inputul este valid, altfel, returnează un obiect { key: value, ... } unde key este tipul erorii și value poate fi orice poți folosi în șablonul tău pentru a genera un mesaj de eroare.

Șablonul conține de asemenea un div pentru a afișa mesajul de eroare dacă intrarea nu este validă.