【问题标题】:Angular material MatTableDataSource Serverside pagination not working角材料 MatTableDataSource 服务器端分页不起作用
【发布时间】:2018-09-09 04:50:16
【问题描述】:

我是 Angular 的新手,我正在尝试使用带有分页和排序的材料表。所以,最初我尝试分页。我坚持这个错误。有没有人帮我分页。

错误是:

类型 '() 上不存在属性 'subscribe' => 可观察的'。

servertable.component.ts

import { Component, OnInit, AfterContentInit, ViewChild } from '@angular/core';
import { MatPaginator, MatTableDataSource } from '@angular/material';
import { UserService } from './user.service';
import { IUser } from './model/IUser';

@Component({
  selector: 'app-servertable',
  templateUrl: './servertable.component.html',
  styleUrls: ['./servertable.component.scss']
})
export class ServertableComponent implements OnInit, AfterContentInit, AfterViewInit {

  dataSource: any;
  users: IUser[];
  displayedColumns = ['name', 'email', 'phone', 'company'];      

  @ViewChild(MatPaginator) paginator: MatPaginator;

  constructor(private service: UserService) { }

  ngOnInit() {
    this.service.getUser.subscribe(results => this.users = results);
    console.dir(this.dataSource);
  }

  ngAfterContentInit() {
    this.dataSource = new MatTableDataSource(this.users);
    this.dataSource.paginator = this.paginator;
  }
}

user.service.ts

import { Injectable } from '@angular/core';
import { HttpClient} from '@angular/common/http';
import { Observable } from 'rxjs/observable';
import { IUser } from './model/IUser';

@Injectable()
export class UserService {

  private serviceUrl = 'https://jsonplaceholder.typicode.com/users';

  constructor(private http: HttpClient) { }

  getUser(): Observable<IUser[]> {
    return this.http.get<IUser[]>(this.serviceUrl);
  }
}

servertable.component.html

<div>
  <mat-table [dataSource]="dataSource">
    <ng-container matColumnDef="name">
      <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
      <mat-cell *matCellDef="let user"> {{user.name}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="email">
      <mat-header-cell *matHeaderCellDef> E-Mail </mat-header-cell>
      <mat-cell *matCellDef="let user"> {{user.email}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="phone">
      <mat-header-cell *matHeaderCellDef> Phone </mat-header-cell>
      <mat-cell *matCellDef="let user"> {{user.phone}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="company">
      <mat-header-cell *matHeaderCellDef> Company </mat-header-cell>
      <mat-cell *matCellDef="let user"> {{user.company.name}} </mat-cell>
    </ng-container>
    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
  </mat-table>
  <mat-paginator [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons></mat-paginator>
</div>

【问题讨论】:

    标签: datatable pagination angular-material observable


    【解决方案1】:

    您没有调用您的服务方法:this.service.getUser.subscribe(results =&gt; this.users = results);。您忘记在 getUser 上添加括号。

    改成:this.service.getUser().subscribe(results =&gt; this.users = results);

    还有一个问题:this.usersngAfterContentInit 中尚不可用,因为getUser() 调用是异步的。将表的分配移至您的 subscribe() 呼叫。整个ngOnInit() 将如下所示:

    ngOnInit() {
        this.service.getUser().subscribe(results => {
            this.users = results;
            this.dataSource = new MatTableDataSource(this.users);
            this.dataSource.paginator = this.paginator;
        });
    }
    

    【讨论】:

    • Tq Tim,你能帮我为这些字段添加排序吗?
    • @chandoo 这并不难,但可能太长而无法发表评论:1:将MatSortModule 添加到您的模块中。 2:servertable.component.ts:添加@ViewChild(MatSort) sort: MatSort;并在onInit中赋值:this.dataSource.sort = this.sort;。 3:您的 html:将 matSort 添加到 mat-table&lt;mat-table [dataSource]="dataSource" matSort&gt; 并将 mat-sort-header 添加到每个 mat-header-cell,例如 &lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; Name &lt;/mat-header-cell&gt;。这应该够了吧。如果不起作用,请发布另一个问题
    • 嗨,tq 用于代码处理。它也帮助我完成了排序。非常感谢@Tim。
    猜你喜欢
    • 2018-05-26
    • 2018-10-10
    • 1970-01-01
    • 2022-06-15
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 2019-07-29
    相关资源
    最近更新 更多