Angular Reactive Form, почему valueChanges вызывается перед слушателем ввода - PullRequest
0 голосов
/ 31 мая 2018

каков порядок событий в случае, если у меня есть реактивная форма и некоторые директивы с hosteListener для keyup, keydown, нажатия клавиш, ввода и т. Д.?

Я создаю реактивную форму с вводимым текстом идиректива, которая принимает ввод и вводит его в верхнем регистре:

@HostListener('input')
onInput() {
  if (this.uppercase) {
    this.el.nativeElement.value = this.el.nativeElement.value.toUpperCase();
  }
}

Но метод valueChanges формы вызывается перед директивой, поэтому значение в модели все еще строчные.

Спасибо!

1 Ответ

0 голосов
/ 09 августа 2018

Это заняло у меня некоторое время, но в конце концов мне удалось взломать его.По сути, мне пришлось взять на себя мост между DOM и моделью.Angular сделает это за вас, если вы не реализуете ControlValueAccessor для своего элемента управления / директивы.Таким образом, вы отвечаете за изменение модели (и, следовательно, за счет прослушивания слушателей до значения ValueChanges), когда считаете нужным:

export const MASK_CONTROL_VALUE_ACCESSOR: any = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => MaskDirective),
  multi: true
};

@Directive({
  selector: "[testMask]",
  providers: [MASK_CONTROL_VALUE_ACCESSOR]
})

export class MaskDirective implements ControlValueAccessor {

  private onChange;
  private nativeElement;

  constructor(private element: ElementRef) {
    this.nativeElement = this.element.nativeElement;
  }

  registerOnChange(fn: any): void {
    this.onChange = fn;
  }
  registerOnTouched(fn: any): void {
  }
  setDisabledState(isDisabled: boolean): void {
    this.nativeElement.disabled = isDisabled;
  }
  writeValue(newValue) {
    newValue = newValue == null ? "" : newValue;
    this.nativeElement.value = newValue;
  }
  @HostListener("input", ["$event"])
  onInput(event: KeyboardEvent) {
    /*DO YOUR STUFF HERE*/
    // Call onChange to fire the valueChanged listeners
    this.onChange(newValue);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...