我的场景是,当收到新的TagID事件时,我必须将其显示在Angular 形式的文本框中.然后将计时器设置为5秒,如果没有收到新事件,则清除文本框.如果接收到新事件,则必须停止先前设置的定时器,并且必须调度定时器.

我的代码如下.在这种情况下,如果连续多次收到相同的TagID,则文本框将被清除,而不是重新创建计时器.

我如何使用rxjs和Angular 来实现所需的逻辑?

 @Input() tagId$: Observable<string>;

    const delay$ =
      this.tagId$.pipe(delay(5000));

    combineLatest([
      this.tagId$,
      delay$,
    ]).pipe()
    .subscribe(([tag, delayedTag]) => {
      let value = tag;;
      if (tag === delayedTag) {
        console.log('tag$$ cleared by delay', tag, delayedTag);
        value = '';
      }
      this.tagIdFormElement?.setValue(value);
      this.form.markAsDirty();
    });

推荐答案

你可以用debounceTime来取消之前的事件并重置计时器,所以只有在5秒没有事件后,你才会得到重置发生,如下图所示!

import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { bootstrapApplication } from '@angular/platform-browser';
import { Subject, tap } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import 'zone.js';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ReactiveFormsModule, CommonModule],
  template: `
    <form [formGroup]="form">
      <input type="text" formControlName="item"/>
    </form>
    <button (click)="setVal()">set value</button>
  `,
})
export class App {
  dummy: Subject<string> = new Subject<string>();
  name = 'Angular';
  form = new FormGroup({
    item: new FormControl(''),
  });

  get item(): FormControl {
    return <FormControl>this.form.get('item');
  }

  setVal() {
    console.log('a', new Date());
    this.dummy.next(
      'this will clear in 5 second if new event not there: ' + Math.random()
    );
  }

  ngOnInit() {
    this.dummy
      .pipe(
        tap((value: string) => {
          this.item.setValue(value);
        }),
        debounceTime(5000)
      )
      .subscribe(() => {
        console.log('b', new Date());
        console.log('time to clear!');
        this.item.setValue('');
      });
  }
}

bootstrapApplication(App);

stackblitz

Angular相关问答推荐

Angular :仅当 Select 第一个日期时才显示第二个日期字段

升级到angular 17并转换为独立的加载器拦截器后,

Angular 15:将数据从主零部件传递到辅零部件

要素存储更改根存储状态

更改动态表单控制Angular 的值

Angular -移位在2个示波器中读取

在Angular 为17的独立零部件中使用@NGX-平移

如何防止打印后的空格后的HTML元素的Angular ?

元素上的Angular 管道链接不起作用

Angular NG5002错误无效的ICU消息和意外字符EOF

当信号的值发生变化时,模板不会更新

Angular 不使用NgRx的简单CRUD应用程序

从具有特定 node 值的现有数组创建新数组

如何在 Angular 中将tailwind 类传递给 fontawesome

Angular:显示带有嵌套子项的内容投影

as和let之间的异步管道区别

如何在 cypress 测试中实现拖放?

如何以Angular 2 获取当前路由自定义数据?

测试一个包含 setTimeout() 的函数

包 '@angular/cli' 不是依赖项