未调用 Angular2 自定义验证器

Angular2 custom validator not called

我写了一个这样的自定义验证指令:

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 看起来像这样:

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

我的问题是,当验证器被初始化时,即 'init' 被记录到控制台,验证函数从未被调用,即 'validate' 从未被记录到控制台,当输入输入字段。由于验证器已初始化,我假设我 "wired" 正确设置了所有内容。那么缺少什么?

我最好的赌注是你还没有引导 Angular 关于表单:

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

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

您可以看到这个 plunk - 它会向控制台输出 "validate"

我分叉并改进了@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'}
    };
}

如果输入有效,validate() 方法必须 return null,否则,它 return 是一个对象 { key: value, ... } 其中 key 是错误类型值可以是您可以在模板中用来生成错误消息的任何内容。

该模板还包含一个 div,用于在输入无效时显示错误消息。

而不是将自定义验证器函数编写为 class/component/Directive 方法, 在 component/Directive 之外编写自定义验证程序应该可行。

validate(c:FormControl) {
    console.error('validate')
    return {'err...':'err...'};
}

@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')
    }

}