RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 954764
Accepted
Вячеслав
Вячеслав
Asked:2020-03-11 00:43:43 +0000 UTC2020-03-11 00:43:43 +0000 UTC 2020-03-11 00:43:43 +0000 UTC

为什么排序在 mat-table 中不起作用?

  • 772

告诉我为什么在表格中排序不起作用,我按照Angular Material官方文档中的示例做所有事情

模板代码:

<h5 class="card-title">****************</h5>

<table mat-table [dataSource]="tabledata" matSort *ngIf="isLoaded">
  <ng-container matColumnDef="Фамилия, имя, отчество">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Фамилия, имя, отчество </th>
    <td mat-cell *matCellDef="let element"> {{element.name}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл P">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл P </th>
    <td mat-cell *matCellDef="let element"> {{element.skillP}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл A">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл A </th>
    <td mat-cell *matCellDef="let element"> {{element.skillA}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл E">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл E </th>
    <td mat-cell *matCellDef="let element"> {{element.skillE}} </td>
  </ng-container>
  <ng-container matColumnDef="скилл I">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> скилл I </th>
    <td mat-cell *matCellDef="let element"> {{element.skillI}} </td>
  </ng-container>
  <ng-container matColumnDef="Подразделение">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Подразделение </th>
    <td mat-cell *matCellDef="let element"> {{element.department}} </td>
  </ng-container>
  <ng-container matColumnDef="Должность">
    <th mat-header-cell *matHeaderCellDef> Должность </th>
    <td mat-cell *matCellDef="let element"> {{element.position}} </td>
  </ng-container>
  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

这是组件代码:

import { Component, OnInit, ViewChild } from '@angular/core';
import { Subscription, combineLatest } from 'rxjs';

import { PersonsService } from 'src/app/shared/services/persons.service';
import { PaeiService } from 'src/app/shared/services/paei.service';
import { Paei } from 'src/app/assessment/paei-test/models/paei.model';
import { Person } from 'src/app/shared/models/person.model';
import { MatTableDataSource, MatSort } from '@angular/material';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'mvv-paei-table',
  templateUrl: './paei-table.component.html',
  styleUrls: ['./paei-table.component.scss']
})

export class PaeiTableComponent implements OnInit {

  sub: Subscription;
  personsList: Person[] = [];
  paeiList: Paei[] = [];
  persons: {
    name: string,
    skillP: number,
    skillA: number,
    skillE: number,
    skillI: number,
    department: string,
    position: string
  }[] = [];

  tabledata: any;


  public displayedColumns = [
    'Фамилия, имя, отчество',
    'скилл P',
    'скилл A',
    'скилл E',
    'скилл I',
    'Подразделение',
    'Должность'
];
  isLoaded = false;

  constructor(
    private personsService: PersonsService,
    private paeiService: PaeiService,
  ) { }

  @ViewChild(MatSort) sort: MatSort;

  ngOnInit() {

    this.sub = combineLatest(
      this.personsService.getPersons(),
      this.paeiService.getAllPaei()
    ).subscribe(value => {
      value[0].forEach(doc => {
        const person = new Person(
          doc.data().name,
          doc.data().middleName,
          doc.data().surname,
          doc.data().gender,
          doc.data().date,
          doc.data().position,
          doc.data().department,
          doc.id
        );
        this.personsList.push(person);
      });

      value[1].forEach(doc => {
        const paei = new Paei(
          doc.data().id,
          doc.data().date,
          doc.data().skillP,
          doc.data().skillA,
          doc.data().skillE,
          doc.data().skillI,
          doc.data().isReaded
        );
        this.paeiList.push(paei);
      });
      for (let i = 0; i < this.paeiList.length; i++) {

        const pers = this.personsList.filter(
          res => res.personId === this.paeiList[i].id);
          const name = pers[0].surname + ' ' + pers[0].name + ' ' + pers[0].middleName;
          this.persons.push(
            {
              name: name,
              skillP: this.paeiList[i].skillP,
              skillA: this.paeiList[i].skillA,
              skillE: this.paeiList[i].skillE,
              skillI: this.paeiList[i].skillI,
              department: pers[0].department,
              position: pers[0].position
            }
          );

          this.tabledata = new MatTableDataSource(this.persons);

        }
        this.isLoaded = true;

        setTimeout(() => {
          this.tabledata.sort = this.sort;
          console.log('проверка сортировки', this.sort);
        }, 1000);

      });

  }

}

不要注意超时。

angular
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. overthesanity
    2020-03-11T06:02:01Z2020-03-11T06:02:01Z

    您没有完全遵循该示例,因为您使用ngIf的是指令:)

    我会假设你已经导入了MatSortModule,所以我会立即描述你的问题。

    当您使用装饰器@ViewChild时,您是在告诉编译器生成一个特定的数据结构,称为NodeDef(节点定义)。在运行时,Angular 不只是构建一个 DOM 树,还为你设置所有必要的类属性,你可以用它们来装饰@Input() | @ViewChild() | @HostBinding()等等。

    在您的示例中,在第一个更改检测机制期间,Angular 调用一个函数checkAndUpdateQuery来设置用@ViewChild() | @ViewChildren() | @ContentChild() | @ContentChildren(). 整个问题是元素table被包裹ng-template(由于使用了指令ngIf),并且在初始阶段也是isLoaded相等false的,因此Angular无法物理访问指令实例MatSort(因为它尚未创建)并设置属性. 此外,元素本身被table异步投影到 DOM 中。

    sort要验证这一点 -在钩子中输出到控制台ngOnInit:

    ngOnInit() {
      console.log(this.sort); // undefined
    }
    

    有2种方法可以解决这个问题:

    1)使用属性hidden而不是指令ngIf:

    <table [hidden]="!isLoaded">
      ...
    </table>
    

    2) 在构造函数中注入对视图的引用,并在设置属性后运行更改检测机制isLoaded = true,这又会再次调用checkAndUpdateQuery将为您设置属性的函数sort:

    constructor(private ref: ChangeDetectorRef) {}
    
    ngOnInit() {
      combineLatest(...).subscribe(() => {
        ...
    
    
        this.isLoaded = true;
        this.ref.detectChanges();
        console.log(this.sort);
        this.tableDataSource.sort = this.sort;
      });
    }
    
    • 1
  2. Best Answer
    Daniil Rabizo
    2020-08-19T01:51:57Z2020-08-19T01:51:57Z

    你有一个指令,*ngIf它不适用于它。尝试将其替换为<table>mat-sort[hidden]="!isLoaded"

    • 1

相关问题

  • 角度材料在角度 7 中不起作用

  • 以角度循环显示图像

  • Angular 密码比较验证器

  • 如何在 Angular 6 上向 sidenav 添加下拉元素?[关闭]

  • 一个组件中有两个指令。冲突

  • 为什么@input 不能以角度工作

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5