У меня есть автозаполнение контроля формы:
@Component({
selector: 'app-autocomplete',
templateUrl: './app-autocomplete.view.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AutoCompleteFilterComponent implements OnInit, OnDestroy, OnChanges {
@Input() value: any;
@Output() onChanged = new EventEmitter();
autoCompleteControl: FormControl = new FormControl();
private autoCompleteControlSubscription: Subscription;
constructor() { }
ngOnInit(): void {
this.autoCompleteControl.setValue(this.value, { emitEvent: false });
this.autoCompleteControlSubscription = this.autoCompleteControl.valueChanges
.pipe(
skipUndefined(),
filter(value => value.length >= 3),
distinctUntilChanged(),
debounceTime(350),
map(value => {
this.onChanged.emit(value.trim());
})
).subscribe();
}
ngOnChanges(changes: SimpleChanges): void {
if (!changes.value.firstChange) {
this.autoCompleteControl.setValue(changes.value.currentValue);
}
}
ngOnDestroy(): void {
if (this.autoCompleteControlSubscription) {
this.autoCompleteControlSubscription.unsubscribe();
}
}
Я получаю начальное значение от store
и передаю его как @Input
переменную:
this.value$ = this._store$.select(s=>s.value);
<app-autocomplete [value]="value$ | async"></app-autocomplete>
Проблема, с которой я столкнулсяis:
- Компонент загружается, и я передаю начальную
value
из store
. - Пользователь вводит что-то в текстовое поле ввода.
- Пользователь прекращает печатать для350 мс (
debounce
время). - I
emit
значение для родителя и использование Action
+ Reducer
для сохранения значения в хранилище. - this.value $
Observable
реагирует на store
изменение и вызывает метод ngOnChange
. - Пользователь продолжает вводить.
- Значение из
store
перезаписывает то, что пользователь уже набрал.
Например, пользователь набрал «stri», затем сделал короткую паузу, затем набрал «string», но значение «store» перезаписывает его значение «string», и он получил значение «stri», которое я передал в «store» перед,Кто-нибудь сталкивался с этим раньше?Единственное решение, которое мы придумали, это проверить фокус и не устанавливать новое значение.