Angle Material을 사용하여 통계 테이블을 만듭니다.
Angular Material, 구성 요소 개발 도구(CDK) 및 Angular 애니메이션 라이브러리를 설치하고 코드 회로도
ng add @angular/material
테이블 회로도를 실행하여 사전 설정된 정렬 가능한 Angular Material을 렌더링할 수 있는 구성 요소를 만듭니다. 페이징 가능한 데이터 소스. [관련 튜토리얼 추천: "angular 튜토리얼"]
ng는 @angular/material:table tex1을 생성한
후 이를 기반으로 수정합니다.
구성요소<div class="mat-elevation-z8">
의 html 파일
<table mat-table class="full-width-table" matSort aria-label="요소"> <!-- ID 열 --> <ng-컨테이너 matColumnDef="id"> <th mat-header-cell *matHeaderCellDef mat-sort-header>일련 번호</th> <td mat-cell *matCellDef="let row">{{row.id}}</td> </ng-컨테이너> <!-- 이름 열 --> <ng-container matColumnDef="이름"> <th mat-header-cell *matHeaderCellDef mat-sort-header> 암석 및 토양 이름</th> <td mat-cell *matCellDef="let row">{{row.name}}</td> </ng-컨테이너> <!-- num1 열 --> <ng-컨테이너 matColumnDef="num1"> <th mat-header-cell *matHeaderCellDef mat-sort-header> 예상 수량</th> <td mat-cell *matCellDef="let row">{{row.num1}}</td> </ng-컨테이너> <!-- num2 열 --> <ng-컨테이너 matColumnDef="num2"> <th mat-header-cell *matHeaderCellDef mat-sort-header> 현재 번호</th> <td mat-cell *matCellDef="let row">{{row.num2}}</td> </ng-컨테이너> <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-row *matRowDef="let row; 열:displayColumns;"></tr> </table> <!-- 테이블 데이터 표시 길이 제어--> <매트 페이지네이터 #페이지네이터 [길이]="데이터소스?.데이터?.길이" [페이지인덱스]="0" [페이지 크기]="10" [pageSizeOptions]="[5, 10, 17]" aria-label="페이지 선택"> </mat-페이지네이터> </div>
구성 요소의 texe1-datasource.ts 파일
import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; 'rxjs/operators'에서 { 지도 }를 가져옵니다. import { Observable, of observableOf, merge } from 'rxjs'; // TODO: 이를 자신만의 데이터 모델 유형으로 바꿉니다. 내보내기 인터페이스 Texe1Item { 이름: 문자열; 아이디: 번호; num1: 숫자; num2: 숫자; } // TODO: 이를 애플리케이션의 실제 데이터로 바꿉니다. const EXAMPLE_DATA: Texe1Item[] = [ {id: 1, 이름: 'silty clay', num1:1000, num2:100,}, {id: 2, 이름: 'silty silty clay', num1:1000, num2:100,}, {id: 3, 이름: 'Clay', num1:1000, num2:100,}, {id: 4, 이름: 'Clayy silt', num1:1000, num2:100,}, {id: 5, 이름: 'silty clay', num1:1000, num2:100,}, {id: 6, name: '각력암(breccia)', num1:1000, num2:100,}, {id: 7, 이름: '中沙', num1:1000, num2:1000,}, {id: 8, 이름: '유기농 토양', num1:1000, num2:100,}, {id: 9, 이름: '이탄 토양 A', num1:1000, num2:100,}, {id: 10, 이름: '이탄토 B', num1:1000, num2:100,}, {id: 11, 이름: 'Sandy silt', num1:1000, num2:100,}, {id: 12, 이름: '미사', num1:1000, num2:100,}, {id: 13, 이름: '고운 모래', num1:1000, num2:100,}, {id: 14, 이름: '굵은 모래', num1:1000, num2:100,}, {id: 15, 이름: '자갈', num1:1000, num2:100,}, {id: 16, name: '자갈(자갈)', num1:1000, num2:100,}, {id: 17, name: '볼더(bolder)', num1:1000, num2:100,}, ]; /** * Texe1 뷰의 데이터 소스는 다음과 같습니다. * 표시된 데이터를 가져오고 조작하기 위한 모든 논리를 캡슐화합니다. * (정렬, 페이지 매김 및 필터링 포함) */ 내보내기 클래스 Texe1DataSource는 DataSource<Texe1Item> {를 확장합니다. 데이터: Texe1Item[] = EXAMPLE_DATA; 페이지네이터: MatPaginator | 정의되지 않음; 정렬: MatSort 정의되지 않음; 생성자() { 감독자(); } /** * 이 데이터 소스를 테이블에 연결하면 테이블이 업데이트됩니다. * 반환된 스트림은 새 항목을 방출합니다. * @returns 렌더링할 항목의 스트림입니다. */ 연결(): 관찰 가능<Texe1Item[]> { if (this.paginator && this.sort) { // 렌더링된 데이터에 영향을 미치는 모든 것을 하나의 업데이트로 결합합니다. // 데이터 테이블이 소비할 스트림입니다. return merge(observableOf(this.data), this.paginator.page, this.sort.sortChange) .pipe(map(() => { return this.getPagedData(this.getSortedData([...this.data ])); })); } 또 다른 { throw Error('연결하기 전에 페이지네이터를 설정하고 데이터 소스를 정렬하세요.'); } } /** * 테이블이 삭제될 때 호출됩니다. 이 함수를 사용하여 정리합니다. * 열려 있는 모든 연결 또는 연결 중에 설정된 보유 리소스를 해제합니다. */ 연결 해제(): 무효 {} /** * 데이터 페이지 매기기(클라이언트 측) * 이는 서버에 적절한 데이터를 요청하여 대체됩니다. */ 개인 getPagedData(데이터: Texe1Item[]): Texe1Item[] { if (this.paginator) { const startIndex = this.paginator.pageIndex * this.paginator.pageSize; return data.splice(startIndex, this.paginator.pageSize); } 또 다른 { 데이터를 반환합니다. } } /** * 데이터를 정렬합니다(클라이언트측). 서버측 정렬을 사용하는 경우 * 이는 서버에 적절한 데이터를 요청하여 대체됩니다. */ 개인 getSortedData(데이터: Texe1Item[]): Texe1Item[] { if (!this.sort || !this.sort.active || this.sort.direction === '') { 데이터를 반환합니다. } return data.sort((a, b) => { const isAsc = this.sort?.direction === 'asc'; 스위치(this.sort?.active) { Case '이름': return Compare(a.name, b.name, isAsc); 케이스 'id': return Compare(+a.id, +b.id, isAsc); 기본값: 0을 반환합니다. } }); } } /** ID/이름 열의 간단한 정렬 비교기(클라이언트측 정렬용) */ 함수 비교(a: 문자열 | 숫자, b: 문자열 | 숫자, isAsc: 부울): 숫자 { return (a < b ? -1 : 1) * (isAsc ? 1 : -1); }
구성요소의 texe1.comComponent.ts 파일
import { AfterViewInit, Component, ViewChild } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTable } from '@angular/material/table'; import { Texe1DataSource, Texe1Item } from './texe1-datasource'; @요소({ 선택기: 'app-texe1', templateUrl: './texe1.comComponent.html', styleUrls: ['./texe1.comComponent.css'] }) 내보내기 클래스 Texe1Component는 AfterViewInit을 구현합니다. @ViewChild(MatPaginator) 페이지네이터!: MatPaginator; @ViewChild(MatSort) 정렬!: MatSort; @ViewChild(MatTable) 테이블!: MatTable<Texe1Item>; 데이터소스: Texe1DataSource; /** 테이블에 표시되는 열 ID는 추가, 제거 또는 재정렬될 수 있습니다. */ displayColumns = ['id', 'name','num1','num2']; 생성자() { this.dataSource = new Texe1DataSource(); } ngAfterViewInit(): 무효 { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; } }
마지막으로 app.comComponent.html 파일에 표시됩니다.
<app-texe1></app-texe1>
렌더링: