我有自动完成表单控件:
@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>
我遇到的问题是:
- 组件加载,我
value
从store
. - 用户在输入文本字段中输入内容。
- 用户停止输入 350 毫秒(
debounce
时间)。 - 我
emit
重视父母并使用Action
+Reducer
将值保留在商店中。 - this.value$对更改和触发方法
Observable
做出反应。store
ngOnChange
- 用户继续输入。
- 来自
store
覆盖用户已经键入的值。
例如,用户输入“stri”,然后稍作停顿,然后输入“string”,但“store”值覆盖了他的“string”值,他得到了我之前放入“store”的“stri”值。有没有人遇到过这个?我们提出的唯一解决方案是检查焦点并且不设置新值。