作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有自动完成表单控件:
@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>
我遇到的问题是:
store
传递初始 value
。去抖动
时间)。向父级发出
值,并使用Action
+ Reducer
将值保存在存储中。Observable
响应 store
变化并触发 ngOnChange
方法。store
中的值会覆盖用户已经输入的内容。例如,用户键入“stri”,然后稍作停顿,然后键入“string”,但是“store”值覆盖了他的“string”值,他得到了我之前放入“store”的“stri”值。有没有人遇到过这个?我们想出的唯一解决方案是检查焦点并且不设置新值。
最佳答案
您正在订阅 ngOnInit 中的更改:
this.autoCompleteControlSubscription = this.autoCompleteControl.valueChanges
还有 ngOnChanges。
this.autoCompleteControl.setValue(changes.value.currentValue);
我将试一试您正在尝试做的事情:
在初始化时,您可能需要修补值并然后设置订阅,这样它们就不会相互干扰。
如果您想在不触发表单的 valueChanges 的情况下修补值,那么在没有事件的情况下进行修补:
this.form.controls[control].patchValue(value, { emitEvent: false });
看看我是如何在 StackBlitz 上使用我自己的 ControlValueAccessor 控件组件执行此操作的.我使用 writeValue
关于javascript - NgOnChanges 在用户键入时覆盖表单控件值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56602850/
我是一名优秀的程序员,十分优秀!