Указано «не определено», где ожидался поток. Может предоставлять наблюдаемый, Обещающий, массив или повторяющийся

#angular #typescript #rxjs #paginator #mat-pagination

Вопрос:

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

Обслуживание-

 getAllCategoryByPage(data?: any): Observable<any> {
    var Url = `/Categories/GetAll`;
    return this.http
      .post<any>(Url, data)
      .pipe(catchError(this.handleError<any>('getAllCategoryByPage', [])));
  }
 

Компоненты .ts-

 @ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort; //sorting is not mandatory in my case
ngOnInit(): void {
    this.loadCategoryList;
    this.dataSource.paginator = this.paginator;
  }
  ngAfterViewInit() {
    this.loadCategoryList();
     this.dataSource.paginator = this.paginator;
  }
loadCategoryList = (): void => {
    this.paginator.page.subscribe((resp) => {console.log(resp);});    
    merge(this.paginator.page)
      .pipe(
        startWith({}),
        switchMap(() => {
          this.asyncService.start();
          console.log(this.paginator.pageIndex ,this.paginator.pageSize);
          return this.categoryService.getAllCategoryByPage(
            {
              "page": this.paginator.pageIndex   1,
              "pageSize": this.paginator.pageSize,
              "searchString": ""
            }
          )
        })
      )
      .subscribe(
        data => {
          console.log(data.apiData);
          this.length = data.totalRecord;
          this.dataSource.paginator = data.apiData;
          this.asyncService.finish();
        }
      );
  };
 

HTML-

 <table mat-table [dataSource]="dataSource">
      <ng-container matColumnDef="sl">
        <th mat-header-cell *matHeaderCellDef> SL. </th>
        <td mat-cell *matCellDef="let element; let i = index;"> {{i 1}} </td>
      </ng-container>
      <ng-container matColumnDef="name">
        <th mat-header-cell *matHeaderCellDef >CATEGORY NAME </th>
        <td mat-cell *matCellDef="let element"> {{element.categoryName}} </td>
      </ng-container>
      <ng-container matColumnDef="status">
        <th mat-header-cell *matHeaderCellDef >STATUS </th>
        <td mat-cell *matCellDef="let element">
         {{element.recStatus}}
        </td>
      </ng-container>
      <ng-container matColumnDef="actions">
        <th mat-header-cell *matHeaderCellDef>ACTIONS</th>
        <td mat-cell *matCellDef="let row" >
          <button class="table-button-action" style="color: red;" (click)="deleteRow(row)" >
            <mat-icon>clear</mat-icon>
          </button>
          <button class="table-button-action" style="color:royalblue;" (click)="onEdit(row)">
            <mat-icon>create</mat-icon>
          </button>
        </td>
      </ng-container>
      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </table>
    <mat-paginator [length]= "length" [pageSizeOptions]="[5, 10, 25, 100]">
    </mat-paginator>
 

Я не получаю данные в таблице. Здесь я получаю ошибку при загрузке страницы, а также при навигации по страницам (с помощью кнопок «Следующий» и «предыдущий»), о которой я понятия не имею, в чем заключается ошибка и как ее решить

Может ли кто-нибудь, пожалуйста, помочь мне исправить это, чтобы оно работало идеально?

Заранее спасибо 🙂

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

1. Это неправильное использование полужирного шрифта… кроме того, это скорее сбивает с толку, чем помогает

2. Я подозреваю, что проблема в merge() том, что вы вызываете его, ngOnInit когда paginator он не имеет значения… вы должны добавить проверку перед этим, чтобы увидеть paginator , действительно ли она имеет значение

3. @MrCodingB Не могли бы вы подробнее рассказать, как это сделать? Я ничего не понимаю…

4. Прежде чем звонить merge() , вы должны разместить заявление if, подобное этому if (!this.paginator) { return; } . Поэтому, если пагинатор не установлен, он не сливается

5. Не могли бы вы, пожалуйста, включить this.categoryService.getAllCategoryByPage сюда содержание функции?

Ответ №1:

Похоже , что служебная функция getAllCategoryByPage не возвращает правильное Observable значение , и я ожидаю, что это произойдет из-за catchError неправильной работы (вы передали функцию непосредственно в нее, не возвращая наблюдаемое).

Поэтому не могли бы вы, пожалуйста, попробовать следующее:

 getAllCategoryByPage(data?: any): Observable<any> {
    var Url = `/Categories/GetAll`;
    return this.http.post<any>(Url, data).pipe(
        catchError(() => {
            this.handleError<any>('getAllCategoryByPage', []);
            return EMPTY;
        })
    );
}
 

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

1. По-прежнему отображается та же ошибка 🙁 Также данные не загружены в таблицу…

2. Не могли бы вы, пожалуйста, поставить его на место?

Ответ №2:

В вашем subscribe обработчике у вас есть это:

 this.dataSource.paginator = data.apiData;
 

Вместо этого вам следует присвоить данные this.dataSource.data свойству.
Попробуйте это:

 this.dataSource.data = data.apiData;
 

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

1. Раньше так и было this.dataSource.data = data.apiData; , но в этом случае кнопки навигации работали неправильно. Итак, я превратил его в this.dataSource.paginator = data.apiData;

2. Вам следует внимательнее ознакомиться с примерами в документации . Вы можете заметить, что данные необходимо назначить DataSource.data, или вы также можете сделать это с помощью метода DataSource.setData.