매트 테이블 도장가 작동하지 발생
나는 모든 것을 위해 노력하고 mat-table
로컬 작업에 정렬을하고, 내가 할 수있는 동안 예상대로 데이터는 (아무에서 전혀 발생하지 않는 언어) 온라인 예처럼 정렬을하지 않는 헤더 행을 클릭, 표시 할 수 있습니다. 이 테스트를 로컬에서 작동 시키려고합니다 : https://material.angular.io/components/sort/overview https://plnkr.co/edit/XF5VxOSEBxMTd9Yb3ZLA?p=preview
Angular CLI로 새 프로젝트를 생성 한 후 다음 단계를 따랐습니다. https://material.angular.io/guide/getting-started
내 로컬 파일은 다음과 가변합니다.
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { MatSort, MatTableModule } from '@angular/material';
import { AppComponent } from './app.component';
import { TableSortingExample } from './table-sorting-example';
@NgModule({
declarations: [
AppComponent,
TableSortingExample,
MatSort
],
imports: [
BrowserModule,
MatTableModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
}
app.component.html
<div style="text-align:center">
<h1>
Welcome to {{title}}!
</h1>
<table-sorting-example></table-sorting-example>
</div>
table-sorting-example.html
<div class="example-container mat-elevation-z8">
<mat-table #table [dataSource]="dataSource" matSort>
<!--- Note that these columns can be defined in any order.
The actual rendered columns are set as a property on the row definition" -->
<!-- ID Column -->
<ng-container matColumnDef="userId">
<mat-header-cell *matHeaderCellDef mat-sort-header> ID </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.id}} </mat-cell>
</ng-container>
<!-- Progress Column -->
<ng-container matColumnDef="progress">
<mat-header-cell *matHeaderCellDef mat-sort-header> Progress </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.progress}}% </mat-cell>
</ng-container>
<!-- Name Column -->
<ng-container matColumnDef="userName">
<mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.name}} </mat-cell>
</ng-container>
<!-- Color Column -->
<ng-container matColumnDef="color">
<mat-header-cell *matHeaderCellDef mat-sort-header> Color </mat-header-cell>
<mat-cell *matCellDef="let row" [style.color]="row.color"> {{row.color}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
</div>
<!-- Copyright 2017 Google Inc. All Rights Reserved.
Use of this source code is governed by an MIT-style license that
can be found in the LICENSE file at http://angular.io/license -->
table-sorting-example.ts
import {Component, ViewChild} from '@angular/core';
import {DataSource} from '@angular/cdk/collections';
import {MatSort} from '@angular/material';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/observable/merge';
import 'rxjs/add/operator/map';
/**
* @title Table with sorting
*/
@Component({
selector: 'table-sorting-example',
styleUrls: ['table-sorting-example.css'],
templateUrl: 'table-sorting-example.html',
})
export class TableSortingExample {
displayedColumns = ['userId', 'userName', 'progress', 'color'];
exampleDatabase = new ExampleDatabase();
dataSource: ExampleDataSource | null;
@ViewChild(MatSort) sort: MatSort;
ngOnInit() {
this.dataSource = new ExampleDataSource(this.exampleDatabase, this.sort);
}
}
/** Constants used to fill up our data base. */
const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple',
'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray'];
const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack',
'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper',
'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth'];
export interface UserData {
id: string;
name: string;
progress: string;
color: string;
}
/** An example database that the data source uses to retrieve data for the table. */
export class ExampleDatabase {
/** Stream that emits whenever the data has been modified. */
dataChange: BehaviorSubject<UserData[]> = new BehaviorSubject<UserData[]>([]);
get data(): UserData[] { return this.dataChange.value; }
constructor() {
// Fill up the database with 100 users.
for (let i = 0; i < 100; i++) { this.addUser(); }
}
/** Adds a new user to the database. */
addUser() {
const copiedData = this.data.slice();
copiedData.push(this.createNewUser());
this.dataChange.next(copiedData);
}
/** Builds and returns a new User. */
private createNewUser() {
const name =
NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' +
NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.';
return {
id: (this.data.length + 1).toString(),
name: name,
progress: Math.round(Math.random() * 100).toString(),
color: COLORS[Math.round(Math.random() * (COLORS.length - 1))]
};
}
}
/**
* Data source to provide what data should be rendered in the table. Note that the data source
* can retrieve its data in any way. In this case, the data source is provided a reference
* to a common data base, ExampleDatabase. It is not the data source's responsibility to manage
* the underlying data. Instead, it only needs to take the data and send the table exactly what
* should be rendered.
*/
export class ExampleDataSource extends DataSource<any> {
constructor(private _exampleDatabase: ExampleDatabase, private _sort: MatSort) {
super();
}
/** Connect function called by the table to retrieve one stream containing the data to render. */
connect(): Observable<UserData[]> {
const displayDataChanges = [
this._exampleDatabase.dataChange,
this._sort.sortChange,
];
return Observable.merge(...displayDataChanges).map(() => {
return this.getSortedData();
});
}
disconnect() {}
/** Returns a sorted copy of the database data. */
getSortedData(): UserData[] {
const data = this._exampleDatabase.data.slice();
if (!this._sort.active || this._sort.direction == '') { return data; }
return data.sort((a, b) => {
let propertyA: number|string = '';
let propertyB: number|string = '';
switch (this._sort.active) {
case 'userId': [propertyA, propertyB] = [a.id, b.id]; break;
case 'userName': [propertyA, propertyB] = [a.name, b.name]; break;
case 'progress': [propertyA, propertyB] = [a.progress, b.progress]; break;
case 'color': [propertyA, propertyB] = [a.color, b.color]; break;
}
let valueA = isNaN(+propertyA) ? propertyA : +propertyA;
let valueB = isNaN(+propertyB) ? propertyB : +propertyB;
return (valueA < valueB ? -1 : 1) * (this._sort.direction == 'asc' ? 1 : -1);
});
}
}
/** Copyright 2017 Google Inc. All Rights Reserved.
Use of this source code is governed by an MIT-style license that
can be found in the LICENSE file at http://angular.io/license */
온라인 테이블처럼 표시 기능이 부족한 이유를 아는 사람이 있습니까?
이 문제가있을 수있는 다른 사람을 위해 : 문제는 내가 MatSortModule을 가져와야한다고 말한 부분 인 앵귤러 머티리얼 웹 사이트에서 API 참조를 제대로 읽지 못했다는 것입니다. app.module.ts의 가져 오기 목록을 다음 으로 변경 한 후
imports: [
BrowserModule,
MatTableModule,
MatSortModule
],
잘 작동했다
정렬 기능이 작동하지만 제대로 정렬되지 않는 문제가있었습니다. 나는 그것이 내가 참조하고있는 matColumnDef
나의 재산과 같은 이름을 가져야 한다는 것을 깨달았다 .class / interface
matCellDef
Angular Material 문서 에 따르면 :
기본적으로 MatTableDataSource는 정렬 된 열의 이름이 열에 표시되는 데이터 속성 이름과 일치한다는 가정하에 정렬됩니다.
예를 들어:
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.name}} </mat-cell>
</ng-container>
name
의 matColumnDef
지시문과 동일해야 name
에 사용되는 <mat-cell>
구성 요소.
시간 초과 블록 내에서 정렬을 추가하면 효과가 있습니다.
dataSource = new MatTableDataSource(this.articleService.getAllArticles());
setTimeout(() => {
this.tableDataSource.sort = this.sort;
this.tableDataSource.paginator = this.paginator;
});
lifecykle hooks를 사용하고 싶지 않은 경우.
테이블이 * ngIf 안에 있으면 작동하지 않습니다. [숨김]으로 변경하면 작동합니다.
matColumnDef 이름과 * matCellDef 실제 값 이름은 동일해야합니다.
예:
<ng-container matColumnDef="oppNo">
<th mat-header-cell *matHeaderCellDef mat-sort-header>Opportunity Number</th>
<td mat-cell *matCellDef="let element">{{element.oppNo}}</td>
</ng-container>
제 경우에는 oppNo가 matColumnDef 이름과 * matCellDef 이름에 대해 동일하며 정렬이 잘 작동합니다.
나는 또한이 문제를 쳤다. 자식이 정의 될 때까지 기다려야하므로 AfterViewInit
onInit가 아닌 을 구현하고 사용해야 합니다.
ngAfterViewInit (){
this.dataSource.sort = this.sort;
}
내 해결책은 몇 가지 문제를 해결하는 것이 었습니다 (기본적으로이 페이지에있는 대부분의 솔루션을 병합).
확인 사항 :
BrowserModule, MatTableModule, MatSortModule
모듈은 루트 모듈 파일로 가져와야합니다.MatTableDatasource
클래스를 사용 하고 데이터 배열을 매개 변수로 전달 했는지 확인하십시오.- 테이블이
*ngIf=....
지시문에 중첩되지 않았는지 확인하십시오 . 대신 다른 조건부 연산을 사용하십시오 (여전히 이유를 이해하지 못함).
나를 위해 * ngIf를 매트 테이블 태그의 [숨김] 속성으로 대체하면 작동했습니다. 이것을 Angular Material 커뮤니티에 버그로 게시하는 방법은 무엇입니까?
콘솔에 자바 스크립트 오류가 있는지 확인하세요. 정렬이 초기화되기 전에 다른 일이 실패했을 수 있습니다.
참고 URL : https://stackoverflow.com/questions/46893164/mat-table-sorting-demo-not-working
'ProgramingTip' 카테고리의 다른 글
UIScrollView에서 프로그래밍 방식으로 스크롤을 강제 중지해야합니까? (0) | 2020.10.22 |
---|---|
여러 배열 키가 있는지 확인하는 방법 (0) | 2020.10.22 |
이메일을 맹목적으로 받아들이지 않도록 확인하는 가장 간단한 임시 임시는 무엇입니까? (0) | 2020.10.22 |
Python에서 정적 메서드를 사용하면 어떤 이점이 있습니까? (0) | 2020.10.22 |
마우스 선택 후 tmux 출력에서 시스템 클립 보드로 복사하는 방법은 무엇입니까? (0) | 2020.10.22 |