angular - 函数在 debounceTime 后被多次调用

标签 angular rxjs

我有一个带有一个字段的响应式(Reactive)表单,当用户停止输入时,我想将值打印到控制台。为此,当字段中的值更改时,我使用了 debounceTime()。 我读了几个关于使用 debounceTime() 的问题,比如 How to use debounceTime in an angular component?Angular and debounce但是我的代码多次打印最新值,然后检测到更改并且 debounceTime 函数中的时间已经过去。

表单的输入字段是这样的:

<input matInput formControlName="name" (keyup)="onInputChange()">

onInputChange函数中的代码是这样的:

this.userForm.get("name").valueChanges
          .pipe(
            debounceTime(500)
          )
          .subscribe(res => {
            console.log(res)
          });

如果输入是test,控制台的结果如下图:

enter image description here

有什么问题吗?

最佳答案

您正在调用一个函数并在每次按键时订阅,您只需要订阅一次而不需要调用 (keyup) 函数,因为这将捕获对输入的任何更改。

看起来正在调用的函数可能会导致创建四个订阅,因此控制台中有四个条目。

<input matInput formControlName="name" (keyup)="onInputChange()">

应该只是

<input matInput formControlName="name">

将此逻辑移到您的 ngOnInit() 中,以便在组件生命周期的早期创建订阅,并且只创建一次。

然后您可以复制该名称的无引用副本,并在 valuesChanged() block 中进行比较,以确保它与发布前的原始名称不匹配。

userForm = this.formBuilder.group({
  name: ['']
)};
public originalName = '';

public ngOnInit(): void
{
    this.userService.getUserById(this.userId).subscribe(res => 
    {
      this.originalName = JSON.parse(JSON.stringify(res.name));
      this.userForm.controls['name'].setValue(res.name);

      this.userForm.get("name").valueChanges.pipe(debounceTime(500)).
      subscribe(res => 
      {
        if (res.name !== this.originalName) 
        {
          // logic to post to server
        }
      });
    });
}

还建议阅读如何在组件被销毁时处理订阅,因为这不会自行处理,有很多可用资源。

关于angular - 函数在 debounceTime 后被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57595188/

相关文章:

javascript - 如何将数据从 API 加载到 Angular 2 中的数组中?

node.js - 如何在 firebase 上使用已部署的应用程序和已部署的函数存储数据

angular - 如何使用 ngrx 和 effects 订阅 Action 成功回调

angular - 类型错误 : Cannot read property 'subscribe' of undefined in unit test

Angular 2+ HTTP 请求 - 显示成功和错误响应的最短持续时间的加载微调器

javascript - RxJS的subscribe函数内部 'this'的值是多少

javascript - 如何从 Angular 中的 BehaviouralSubject 中提取值

angular - 更改日期时间选择器输入 react 形式中的时间格式

typescript - 订阅者不应该在可观察的错误中停止

rxjs - 跟踪 RxJ 中的异步操作