我试图在我的项目中在mat-table中实现mat-sort。启动我的项目后,我看到“排序”图标,可以单击它,但是结果中没有任何排序,始终是同一 View 。

组件文件:

@Component({
  selector: 'app-test-component',
  templateUrl: './testComponent.component.html',
  styleUrls: ['./testComponent.component.css'],
  providers: [TestService],
})

export class TestComponent implements OnInit, OnDestroy, AfterViewInit {

  displayedColumns = ['Column1'];

  dataSource = new MatTableDataSource<UserModel>();
  private exDisplayNames: Subscription;


  @ViewChild(MatSort) sort: MatSort;

  constructor(private testService: TestService) {   }

  ngOnInit() {
    this.exDisplayNames = this.testService.userNamesChanged.subscribe((userNameData: UserModel[]) => {
      this.dataSource.data = userNameData;
    });
    this.testService.fetchUserName();
  }

  ngAfterViewInit() {
    this.dataSource.sort = this.sort;
  }

  ngOnDestroy() {

    if (this.exDisplayNames) {
        this.exDisplayNames.unsubscribe();
    }
  }

 }

服务文件:
@Injectable()
export class TestService {


    userNamesChanged = new Subject<UserModel[]>();
    private availableUserName: UserModel[] = [];


    private fbSubs: Subscription[] = [];

    constructor(private db: AngularFirestore) { }


    fetchUserName() {
        this.fbSubs.push(this.db.collection('names/')
            .snapshotChanges()
            .map(docArray => {
                return docArray.map(doc => {
                    return {
                        displayUserName: doc.payload.doc.data().nick,
                    };
                });
            })
            .subscribe((userData: UserModel[]) => {
                this.availableUserName = userData;
                this.userNamesChanged.next([...this.availableUserName]);
            }, error => {
                console.log(error);
            }));
    }

}

html文件:
<section fxLayoutAlign="center">
  <mat-card>
    <mat-card-content>
      <mat-table [dataSource]="dataSource" matSort>

        <ng-container matColumnDef="Column1">
          <mat-header-cell *matHeaderCellDef mat-sort-header>Nick</mat-header-cell>
          <mat-cell fxLayout="row" fxLayoutAlign="center center" *matCellDef="let element">{{ element.displayUserName}}</mat-cell>
        </ng-container>

        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
      </mat-table>
    </mat-card-content>
  </mat-card>
</section>

还导入了所有必需的 Material 模块:MatSortModule, MatTabsModule

我的步骤是:
1.添加在组件中:@ViewChild(MatSort) sort: MatSort
2.实现AfterViewInit。
3.新增:
ngAfterViewInit() {
   this.dataSource.sort = this.sort;
 }
  • 在html文件中添加:<mat-table>中的matSort。
  • <mat-cell-header>中添加了mat-sort-header。

  • 就像我写的一样:我在列上看到了排序图标,但是单击后-没有任何变化,也没有排序。

    最佳答案

    我不确定您的UserModel看起来如何,但我认为它不包含Column1属性:matColumnDef="Column1"将该部分更改为matColumnDef="displayUserName"或模型中具有的任何属性。
    同时更改displayedColumns = ['displayUserName'];docs:

    10-06 04:31