Как изменить состояние переключения в исходное состояние при сбое вызова API

#angular #typescript #angular-material

#angular #typescript #angular-материал

Вопрос:

Я создаю приложение, в котором администраторы могут деактивировать / активировать любого сотрудника. В основном, когда моя страница загружается, активное состояние каждого сотрудника привязывается к mat-table извлеченному из ответа API. Если администратор деактивирует / активирует любого сотрудника с помощью другого вызова API и по какой-то причине вызывает ошибки, я хочу, чтобы переключатель был переключен в предыдущее состояние.

Пример: Я извлекаю данные сотрудника из базы данных для emp1 in mat-table со следующими полями: id , fname , mname , lname , role , activestate (true / false). Теперь, если я переключаюсь activestate с true на false или наоборот, я делаю HTTP-вызов API соответственно. Если этот вызов API завершается с ошибкой по какой-либо причине, пользователь должен увидеть исходное состояние activestate переменной.

Вот функция, которую я вызываю, когда пользователи меняют состояние переключения.

       /** Update employee is activated state*/
  updateEmployeeActiveState(e: any, empoyee: Employee, row) {
    console.log(row);
    var user = JSON.parse(localStorage.getItem('currentUser'));
    if (e.checked) {
      this.backendService.putEmployeeState(user.clientId, empoyee.employeeId, 1).subscribe(response => {

        this._snackBar.open(response.toString(), '', {
          duration: 3000,
          verticalPosition: 'bottom'
        });
      }, (error) => {

        this._snackBar.open("error -->" error, '', {
          duration: 3000
        });
       this.dataSource.data[row].user.activeState = 0;
        
        
      });
    } else {
      this.backendService.putEmployeeState(user.clientId, empoyee.employeeId, 0).subscribe(response => {

        this._snackBar.open(response.toString(), '', {
          duration: 3000,
          verticalPosition: 'bottom'
        });
      }, (error)=> {

        this._snackBar.open("error -->" error, '', {
          duration: 3000
        });
        this.dataSource.data[row].user.activeState = 1;
      });
    }
  }
  

Код шаблона:

 <!-- Is Activated Column -->
<ng-container matColumnDef="activeState">
    <th mat-header-cell *matHeaderCellDef> Is Activated </th>
    <td mat-cell *matCellDef="let element; let rowNo = index;" data-title="User Name:"><mat-slide-toggle *ngIf="element.user?.userName" [checked]="element.user.activeState == 1" (change)="updateEmployeeActiveState($event, element, rowNo)" [(ngModel)]="element.user.activeState"></mat-slide-toggle></td>
  </ng-container>
  

Пожалуйста, игнорируйте row.user.activeState , поскольку я пытался переназначить состояние сотрудника, но это не сработало.

Комментарии:

1. Пожалуйста, также включите код шаблона, связанный с этим фрагментом.

2. Я написал новый код, в котором, если я получаю ошибку, я изменяю активное состояние пользователя, но теперь я сталкиваюсь с новой проблемой, которая заключается в том, что если я выключу свой сервер и переключусь, я получу сообщение об ошибке Typescripy:activestate= null не может получить доступ

Ответ №1:

Проблема

Ваш код полностью работает только с одной проблемой

Рассмотрим следующие две строки

 this.dataSource.data[row].user.activeState = 0;
...
this.dataSource.data[row].user.activeState = 1;
  

Эти строки не запускают обнаружение изменений. Рассмотрите возможность добавления способа запуска обнаружения изменений, например, с помощью оператора распространения (…)

   // Update employee is activated state
  updateEmployeeActiveState(e: any, empoyee: Employee, row) {
     const user = JSON.parse(localStorage.getItem('currentUser'));
     const activeState = e.checked ? 0 : 1
     this.backendService
       .putEmployeeState(user.clientId, empoyee.employeeId, activeState)
       .subscribe({
          next:() => {
             this._snackBar.open(response.toString(), '', {
               duration: 3000,
               verticalPosition: 'bottom'
              });
          },
          error: () => {
            this._snackBar.open("error -->" error, '', {
              duration: 3000
           });
            // Change Back to initial state
            this.dataSource.data[row].user.activeState = !activeState;
            
            // Trigger change detection
            this.dataSource = [...this.dataSource]
          }
       })
  }