首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角2:去弹(ngModelChange)?

角2:去弹(ngModelChange)?
EN

Stack Overflow用户
提问于 2016-12-23 23:13:26
回答 4查看 33.1K关注 0票数 52

有什么方法可以破解模板指令(ngModelChange)吗?

或者,或者,用另一种方式做这件事,最不痛苦的方法是什么?

我所看到的最接近的答案是:如何观察角度2的形状变化?

因此,例如,我有一个文本输入,我想获得onChange更新,但我想从每次击键中删除它:

代码语言:javascript
运行
复制
<input type="text" class="form-control" placeholder="Enter a value" name="foo" [(ngModel)]="input.event.value" (ngModelChange)="onFieldChange($event, input)">

去弹跳onFieldChange()

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-13 12:14:05

编辑

在新版本的Angular中,可以使用updateOnngModelOption中设置'blur'链接到angular.io文档

代码示例:

代码语言:javascript
运行
复制
<input [(ngModel)]="value"
  [ngModelOptions]="{ updateOn: 'blur' }"
  (ngModelChange)="updateOnlyOnBlur($event)"> 

遗留

如果您不想使用formcontrol方法,下面是取消击键的不那么痛苦的方法。

search.component.html

代码语言:javascript
运行
复制
<input type="text" placeholder="Enter a value" name="foo" [(ngModel)]="txtQuery" (ngModelChange)="onFieldChange($event)">

search.component.ts

代码语言:javascript
运行
复制
    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);
    }
}
票数 73
EN

Stack Overflow用户

发布于 2018-10-24 21:02:12

对于RxJs 6+

选择的答案不适用于RxJs 6+。以下是你必须改变的东西:

进口品必须是这样的:

代码语言:javascript
运行
复制
import { debounceTime, distinctUntilChanged, Subject } from 'rxjs';

你需要打电话给pipe

代码语言:javascript
运行
复制
// ...
this.txtQueryChanged
   .pipe(debounceTime(1000), distinctUntilChanged())
   .subscribe(model => {
       this.txtQuery = model;
       // api call
   });
 // ...

看一看这篇文章的进一步阅读。

票数 44
EN

Stack Overflow用户

发布于 2020-06-12 13:44:21

我写了一个小指令来解决这个问题。

如何使用:

代码语言:javascript
运行
复制
<input [ngModel]="someValue" (ngModelChangeDebounced)="someValue = $event">

您可以选择设置一个退出时间(默认为500):

代码语言:javascript
运行
复制
[ngModelChangeDebounceTime]="200"

该指令本身:

代码语言:javascript
运行
复制
@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

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41308826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档