Angular,当用户单击按钮或多次提交时如何处理?

拉吉夫·库马尔

我们如何防止用户多次提交?当前的问题是当用户多次点击提交时,它会创建多个用户,它应该只创建一次并在创建另一个之前等待

#html代码

<button mat-flat-button color="primary" [disabled]="userStatus == 'USER_EXISTS_ON_CURRENT_ACCOUNT'" (click)="createUser()">Create
                        User</button>

#ts 代码

createUser() {
    this.accountService.create(this.modelForm.value).pipe(
      finalize(() => {
        this.isInProgress = false;
      })
    ).subscribe({next: (res) => { this.notificationService.showSuccess('User has been created successfully.');
        this._router.navigate(['settings/user']);
      },
      error: (err) => {this.notificationService.showError('Something went wrong, Try again later.');
        this.isInProgress = false;
      },
      complete: () => {
        this.isInProgress = false;
      },
    });
  }
纳夫纳特·贾达夫

我稍微更新了你的代码,

1 - 我们必须在模板中创建一个用户按钮并且

    <button #createUserBtn mat-flat-button color="primary" [disabled]="userStatus == 'USER_EXISTS_ON_CURRENT_ACCOUNT'"> CreateUser </button>

2 - 在 .ts 文件中访问创建用户按钮

@ViewChild('createUserBtn', {static:true}) button;

3 - 创建变量clicks$来存储点击事件

clicks$: Observable<any>;

4 - 在 ngOnInit: 初始化clicks$变量以监听点击事件

this.clicks$ = fromEvent(this.button.nativeElement, 'click');

5 - 在 ngOnInit 中:在每个点击事件上,即click$我们将把我们的事件传递给exhaustMap

ExhaustMap 的美妙之处在于,一旦第一个(外部 observable)事件被触发,它将停止监听事件(外部 Observable),直到它完成其内部 observable

所以在我们的例子中,当用户第一次点击按钮(事件)时,exhaustMap将停止监听按钮点击事件,直到完成我们的 API 调用createUser()我们将使用该handleResponse()方法处理这个 API 调用 observable

ngOnInit() {
    this.clicks$ = fromEvent(this.button.nativeElement, 'click');
    
    const result$ = this.clicks$.pipe(
        tap(x => console.log('clicked.')),
        exhaustMap(ev => {
            console.log(`processing API call`);
            return this.createUser();
        })
    );
    
    result$.subscribe(this.handleResponse());
}

创建用户 API 调用

createUser(): Observable<any> {
    return this.accountService.create(this.modelForm.value).pipe(
      finalize(() => (this.isInProgress = false))
    );
  }

处理响应

handleResponse(): any {
    return {
      next: res => {
        this.notificationService.showSuccess('User has been created successfully.');
        this._router.navigate(['settings/user']);
      },
      error: err => {
        this.notificationService.showError('Something went wrong, Try again later.');
        this.isInProgress = false;
      }
      complete: () => this.isInProgress = false;
    };
  }

演示

如果您无法访问按钮,您可以将 ngOnit 代码移动到AfterViewInit让我知道是否有任何错误,因为我还没有完全测试您的代码。

 ngAfterViewInit(): void {
    fromEvent(this.button.nativeElement, 'click')
      .pipe(
        tap(x => console.log('clicked.')),
        exhaustMap(ev => {
          console.log(`processing API call`);
          return this.createUser();
        })
      )
      .pipe(tap(x => console.log('Api call completed....')))
      .subscribe(this.handleResponse());
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当用户手动而不是通过链接输入URL时如何处理?

当用户单击“提交”时,是否可以将按钮中的值传递给表单?

JWT:当用户打开新标签页时如何处理GET请求?

当用户单击时,如何从jquery ui对话框中获取按钮ID的值?

当用户单击按钮时,如何保存可重复使用的React组件?

当用户单击“提交”按钮时,带有JavaScript的Sweetalert弹出消息

当用户单击批处理脚本中的关闭按钮时,我可以弹出消息吗?

当应用在Xamarin iOS上被杀死时,如何处理Firebase事件或当用户按下按钮清除通知时如何处理事件?

单击单选按钮时如何处理?

SwiftMessage:当用户在消息视图外部点击时如何处理动作?

当用户已经单击10次时如何设置单击按钮的限制-Android

用户单击提交按钮时如何更新PHP表单?

如何实现选择,以便当用户单击提交按钮时我可以在代码中访问选择的值

当按钮数量可变时,如何处理多个提交按钮?

提交按钮没有名称时如何处理表单提交按钮

当用户不允许位置时如何处理

当用户单击“输入”按钮时触发按钮

当用户单击 Objective C 中的 myLocation 按钮时如何执行操作?

当用户单击提交按钮时如何显示用户输入。当用户单击清除按钮时也清除消息。(Angularjs)

当用户单击按钮时如何显示上传的图像?

当用户单击 react-router-dom 上的后退按钮时,如何更改组件的状态?

当用户单击“快速回复”按钮时,如何打开 webview?

当用户在按钮单击时输入无效的日期格式时如何显示验证错误?

当用户单击按钮时如何添加页面预加载器

当用户再次单击按钮时如何推迟隐藏视图?

当用户单击提交按钮时,付款重定向无法正常工作

当用户单击 react.js 中的按钮时如何动态添加输入字段

当用户单击按钮 vuejs 时,如何使对象中的项为真?

当用户按下提交按钮时,如何在 $alert 内的表单中显示用户提交的 $name 输入?