有什么方法可以破解模板指令(ngModelChange)
吗?
或者,或者,用另一种方式做这件事,最不痛苦的方法是什么?
我所看到的最接近的答案是:如何观察角度2的形状变化?
因此,例如,我有一个文本输入,我想获得onChange更新,但我想从每次击键中删除它:
<input type="text" class="form-control" placeholder="Enter a value" name="foo" [(ngModel)]="input.event.value" (ngModelChange)="onFieldChange($event, input)">
去弹跳onFieldChange()
发布于 2017-10-13 12:14:05
编辑
在新版本的Angular中,可以使用updateOn
在ngModelOption
中设置'blur'
。链接到angular.io文档。
代码示例:
<input [(ngModel)]="value"
[ngModelOptions]="{ updateOn: 'blur' }"
(ngModelChange)="updateOnlyOnBlur($event)">
遗留
如果您不想使用formcontrol
方法,下面是取消击键的不那么痛苦的方法。
search.component.html
<input type="text" placeholder="Enter a value" name="foo" [(ngModel)]="txtQuery" (ngModelChange)="onFieldChange($event)">
search.component.ts
export class SearchComponent {
txtQuery: string; // bind this to input with ngModel
txtQueryChanged: Subject<string> = new Subject<string>();
constructor() {
this.txtQueryChanged
.debounceTime(1000) // wait 1 sec after the last event before emitting last event
.distinctUntilChanged() // only emit if value is different from previous value
.subscribe(model => {
this.txtQuery = model;
// Call your function which calls API or do anything you would like do after a lag of 1 sec
this.getDataFromAPI(this.txtQuery);
});
}
onFieldChange(query:string){
this.txtQueryChanged.next(query);
}
}
发布于 2018-10-24 21:02:12
对于RxJs 6+
选择的答案不适用于RxJs 6+。以下是你必须改变的东西:
进口品必须是这样的:
import { debounceTime, distinctUntilChanged, Subject } from 'rxjs';
你需要打电话给pipe
// ...
this.txtQueryChanged
.pipe(debounceTime(1000), distinctUntilChanged())
.subscribe(model => {
this.txtQuery = model;
// api call
});
// ...
看一看这篇文章的进一步阅读。
发布于 2020-06-12 13:44:21
我写了一个小指令来解决这个问题。
如何使用:
<input [ngModel]="someValue" (ngModelChangeDebounced)="someValue = $event">
您可以选择设置一个退出时间(默认为500):
[ngModelChangeDebounceTime]="200"
该指令本身:
@Directive({
selector: '[ngModelChangeDebounced]',
})
export class NgModelChangeDebouncedDirective implements OnDestroy {
@Output()
ngModelChangeDebounced = new EventEmitter<any>();
@Input()
ngModelChangeDebounceTime = 500; // optional, 500 default
subscription: Subscription;
ngOnDestroy() {
this.subscription.unsubscribe();
}
constructor(private ngModel: NgModel) {
this.subscription = this.ngModel.control.valueChanges.pipe(
skip(1), // skip initial value
distinctUntilChanged(),
debounceTime(this.ngModelChangeDebounceTime)
).subscribe((value) => this.ngModelChangeDebounced.emit(value));
}
}
Stackblitz:https://stackblitz.com/edit/angular-9-0-0-rc-1-y2q2ss
https://stackoverflow.com/questions/41308826
复制相似问题