Ce n'est pas possible d'emblée, car le validateur est directement déclenché lorsque l'option input
est utilisé pour déclencher les mises à jour. Voir cette ligne dans le code source :
Si vous voulez tirer parti d'un temps de déblocage à ce niveau, vous devez obtenir une observable directement liée à la fonction input
de l'élément DOM correspondant. Ce problème dans Github pourrait vous donner le contexte :
Dans votre cas, une solution de contournement consisterait à mettre en œuvre un accesseur de valeur personnalisé en tirant parti de l'outil de gestion de l'accès à l'information. fromEvent
méthode de l'observable.
En voici un exemple :
const DEBOUNCE_INPUT_VALUE_ACCESSOR = new Provider(
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => DebounceInputControlValueAccessor), multi: true});
@Directive({
selector: '[debounceTime]',
//host: {'(change)': 'doOnChange($event.target)', '(blur)': 'onTouched()'},
providers: [DEBOUNCE_INPUT_VALUE_ACCESSOR]
})
export class DebounceInputControlValueAccessor implements ControlValueAccessor {
onChange = (_) => {};
onTouched = () => {};
@Input()
debounceTime:number;
constructor(private _elementRef: ElementRef, private _renderer:Renderer) {
}
ngAfterViewInit() {
Observable.fromEvent(this._elementRef.nativeElement, 'keyup')
.debounceTime(this.debounceTime)
.subscribe((event) => {
this.onChange(event.target.value);
});
}
writeValue(value: any): void {
var normalizedValue = isBlank(value) ? '' : value;
this._renderer.setElementProperty(this._elementRef.nativeElement, 'value', normalizedValue);
}
registerOnChange(fn: () => any): void { this.onChange = fn; }
registerOnTouched(fn: () => any): void { this.onTouched = fn; }
}
Et utilisez-le de cette façon :
function validator(ctrl) {
console.log('validator called');
console.log(ctrl);
}
@Component({
selector: 'app'
template: `
<form>
<div>
<input [debounceTime]="2000" [ngFormControl]="ctrl"/>
</div>
value : {{ctrl.value}}
</form>
`,
directives: [ DebounceInputControlValueAccessor ]
})
export class App {
constructor(private fb:FormBuilder) {
this.ctrl = new Control('', validator);
}
}
Voir ce plunkr : https://plnkr.co/edit/u23ZgaXjAvzFpeScZbpJ?p=preview .
0 votes
Je pense que ce n'est pas possible... J'ai posé la question dans le passé mais je n'ai pas de réponse : github.com/angular/angular/issues/6895 .
0 votes
@ThierryTemplier alors avez-vous un moyen de contourner ce problème ?