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의 장점은 첫 번째(외부 관찰 가능) 이벤트가 트리거되면 내부 관찰 가능이 완료될 때까지 이벤트(외부 관찰 가능) 수신을 중지한다는 것입니다.

따라서 우리의 경우 사용자가 버튼을 처음 클릭하면(이벤트), exhaustMapAPI 호출이 완료될 때까지 버튼 클릭 이벤트 수신을 중지합니다 createUser(). 이 API 호출 관찰 가능은 handleResponse()메서드를 사용하여 처리합니다 .

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;
    };
  }

데모

버튼에 액세스할 수 없는 경우 코드를 AfterViewInit완전히 테스트하지 않았기 때문에 ngOnit 코드를 오류가 있으면 알려주세요 로 이동할 수 있습니다.

 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리뷰
로그인참여 후 검토

관련 기사

버튼 수가 가변적 일 때 여러 제출 버튼을 처리하는 방법은 무엇입니까?

버튼을 여러 번 클릭 할 때 다른 JS 함수를 호출하는 방법은 무엇입니까?

사용자가 버튼을 5 번 클릭 할 때 경고를 실행하는 방법은 무엇입니까?

사용자가 버튼을 5 번 클릭 할 때 경고를 실행하는 방법은 무엇입니까?

Angular JS를 사용하여 양식에서 여러 제출 버튼을 처리하는 방법은 무엇입니까?

버튼을 여러 번 클릭 할 때 애플리케이션이 중단되는 것을 방지하는 방법은 무엇입니까?

onclick 이벤트가있는 div의 버튼-버튼을 클릭 할 때 둘 중 하나만 트리거하는 방법은 무엇입니까?

제출 버튼을 클릭할 때 재설정 시간을 추가하는 방법은 무엇입니까?

js를 사용하여 버튼을 클릭할 때 테이블을 숨기는 방법은 무엇입니까?

Razor를 사용하여 버튼을 클릭 할 때 변수를 설정하는 방법은 무엇입니까?

사용자가 제출 버튼을 클릭 할 때까지 양식 입력 바인딩을 연기하는 방법은 무엇입니까?

사용자가 버튼을 클릭할 때 List에 TextField를 추가하는 방법은 무엇입니까?

사용자가 잘못된 패턴을 여러 번 입력 할 때 제한을 설정하는 방법은 무엇입니까?

ref가 사용될 때 버튼을 클릭할 때 드롭다운을 닫거나 열게 하는 방법은 무엇입니까? (반응)

사용자가 Angular 4의 특정 구성 요소에서 /에서 브라우저의 뒤로 버튼을 클릭 할 때만 기능을 감지하거나 실행하는 방법은 무엇입니까?

패턴이 일치 할 때 sed를 사용하여 여러 줄을 삭제하고 첫 번째 빈 줄까지 멈출 방법은 무엇입니까?

여러 버튼을 클릭 할 때 대화 상자 내에서 TextView의 텍스트를 변경하는 방법은 무엇입니까? kotlin 사용

Smooch : 사용자가 버튼을 클릭 할 때 포스트 백을 트리거하는 방법은 무엇입니까?

Winforms 사용자가 버튼을 클릭 할 때까지 기다리는 방법은 무엇입니까?

버튼을 여러 번 클릭 (작동)하는 방법은 무엇입니까?

버튼 하나를 클릭할 때 새 창을 여는 방법은 무엇입니까?

JavaScript를 사용하여 다른 버튼을 클릭 할 때 버튼을 숨기거나 표시하는 방법

같은 버튼을 클릭 할 때 div를 표시하거나 숨기는 방법은 무엇입니까?

버튼을 두 번 클릭 할 때 반복되는 동작을 방지하는 방법은 무엇입니까?

버튼을 다시 클릭 할 때 여기서 핸들러를 중지하는 방법은 무엇입니까?

i18next를 사용하여 번역을 처리할 때 React/Gatsby 앱에 경로를 추가하는 방법은 무엇입니까?

사용자가 닫기 버튼을 클릭 할 때만 Materialise 모달을 닫는 방법은 무엇입니까?

사용자가 버튼을 클릭하고 새 값을 생성할 때 삭제할 이전 Tkinter 값을 가져오는 방법은 무엇입니까?

버튼을 클릭 할 때 iPhone이 두 번 진동하도록하는 방법은 무엇입니까?