gpt4 book ai didi

angular - material2数据表的使用方法

转载 作者:太空狗 更新时间:2023-10-29 16:50:40 26 4
gpt4 key购买 nike

我正在尝试实现 Material2 data table .但是我无法理解如何以正确的方式使用它。

import {Component, ElementRef, ViewChild} from '@angular/core';
import {DataSource} from '@angular/cdk';
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';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/observable/fromEvent';

@Component({
selector: 'table-filtering-example',
styleUrls: ['table-filtering-example.css'],
templateUrl: 'table-filtering-example.html',
})
export class TableFilteringExample {
displayedColumns = ['userId', 'userName', 'progress', 'color'];
exampleDatabase = new ExampleDatabase();
dataSource: ExampleDataSource | null;

@ViewChild('filter') filter: ElementRef;

ngOnInit() {
this.dataSource = new ExampleDataSource(this.exampleDatabase);
Observable.fromEvent(this.filter.nativeElement, 'keyup')
.debounceTime(150)
.distinctUntilChanged()
.subscribe(() => {
if (!this.dataSource) { return; }
this.dataSource.filter = this.filter.nativeElement.value;
});
}
}

/** 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> {
_filterChange = new BehaviorSubject('');
get filter(): string { return this._filterChange.value; }
set filter(filter: string) { this._filterChange.next(filter); }

constructor(private _exampleDatabase: ExampleDatabase) {
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._filterChange,
];

return Observable.merge(...displayDataChanges).map(() => {
return this._exampleDatabase.data.slice().filter((item: UserData) => {
let searchStr = (item.name + item.color).toLowerCase();
return searchStr.indexOf(this.filter.toLowerCase()) != -1;
});
});
}

disconnect() {}
}

上面是让我很迷惑的datatable的代码。甚至他们的文档也很差。谁能解释一下上面代码的流程是什么?

如果您觉得问题太基础而无法提出,请忽略?

最佳答案

示例中的代码是通用表的定义,使用了 material2 规范中的新 cdk 组件。你必须记住 md-tablecdk-table 的可视化实现,所以你需要声明一个 cdk,其模型与 md-model 兼容HTML。

例如:

我使用以下实现声明了一个cdk-table:

  1. 首先是依赖:

Material2 中的新 CDK 组件,使用:

import { DataSource } from '@angular/cdk';
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';
  1. TS 中 HTML 结构的定义:

我定义了一个 displayedColumns 数组,项目是我的 HTML 表中的列,按顺序:

displayedColumns = ['userId', 'userName', 'progress'];

ExampleDatabase 类型的数据库(具有特定手动定义的对象):

exampleDatabase = new ExampleDatabase();

最后,我声明了一个dataSource,这是我数据的来源。是手动定义或数据为空的对象。

dataSource: ExampleDataSource | null;

ngOnInit() 方法中,我简单地声明我的 dataSource 是一个新的 ExampleDataSource ,参数是我的 exampleDataBase.

好的,现在开始实现其余的代码:

首先,为DataBase 声明一个接口(interface)。这对于保持数据的一致性非常重要,数据库必须遵守定义的方案。在这个例子中,数据库有三列:id、name 和 progress:

export interface UserData {
id: number;
name: string;
progress: string;
}

下一步是使用我的DataBase 中的数据定义创建一个类(对象)ExampleDatabase。您可以创建连接到实际数据库(PostgreSQL、MongoDB)的服务,获取实际数据并使用另一种方法为 cdk-datatable 创建对象,但在本示例中,我们使用的是在运行时模拟的内存数据库。

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() {

return {
id: 1,
name: 'example',
progress: Math.round(Math.random() * 100).toString()
};
}
}

很好,最后我用我的 DataSource 定义创建了第二个类。

export class ExampleDataSource extends DataSource<any> {
constructor(private _exampleDatabase: ExampleDatabase) {
super();
}

/** Connect function called by the table to retrieve one stream containing the data to render. */
connect(): Observable<UserData[]> {
return this._exampleDatabase.dataChange;
}

disconnect() { }
}

此方法确保数据格式正确,并释放与DataBase(在内存中)的“连接”以获取其中的数据。

最后,在HTML中使用md-table组件或cdk-table组件。 md-table组件使用material design风格,cdk-table使用generic风格..

md 表:

<div class="example-container mat-elevation-z8">
<md-table #table [dataSource]="dataSource">

<!-- ID Column -->
<ng-container cdkColumnDef="userId">
<md-header-cell *cdkHeaderCellDef> ID </md-header-cell>
<md-cell *cdkCellDef="let row"> {{row.id}} </md-cell>
</ng-container>

<!-- Progress Column -->
<ng-container cdkColumnDef="progress">
<md-header-cell *cdkHeaderCellDef> Progress </md-header-cell>
<md-cell *cdkCellDef="let row"> {{row.progress}}% </md-cell>
</ng-container>

<!-- Name Column -->
<ng-container cdkColumnDef="userName">
<md-header-cell *cdkHeaderCellDef> Name </md-header-cell>
<md-cell *cdkCellDef="let row"> {{row.name}} </md-cell>
</ng-container>

<md-header-row *cdkHeaderRowDef="displayedColumns"></md-header-row>
<md-row *cdkRowDef="let row; columns: displayedColumns;"></md-row>
</md-table>
</div>

cdk 表:

<div class="example-container mat-elevation-z8">
<cdk-table #table [dataSource]="dataSource" class="example-table">

<!-- ID Column -->
<ng-container cdkColumnDef="userId">
<cdk-header-cell *cdkHeaderCellDef class="example-header-cell"> ID </cdk-header-cell>
<cdk-cell *cdkCellDef="let row" class="example-cell"> {{row.id}} </cdk-cell>
</ng-container>

<!-- Progress Column -->
<ng-container cdkColumnDef="progress">
<cdk-header-cell *cdkHeaderCellDef class="example-header-cell"> Progress </cdk-header-cell>
<cdk-cell *cdkCellDef="let row" class="example-cell"> {{row.progress}}% </cdk-cell>
</ng-container>

<!-- Name Column -->
<ng-container cdkColumnDef="userName">
<cdk-header-cell *cdkHeaderCellDef class="example-header-cell"> Name </cdk-header-cell>
<cdk-cell *cdkCellDef="let row" class="example-cell"> {{row.name}} </cdk-cell>
</ng-container>

<cdk-header-row *cdkHeaderRowDef="displayedColumns" class="example-header-row"></cdk-header-row>
<cdk-row *cdkRowDef="let row; columns: displayedColumns;" class="example-row"></cdk-row>
</cdk-table>
</div>

其余的实现、搜索、菜单、复选框等,由您负责实现处理信息的逻辑。

使用有关 cdk-table 的文档了解更多详细信息:

https://material.angular.io/guide/cdk-table

结果:

enter image description here

Do me saber and achievement,我理解我的解释,我为我的英语道歉。我在学习。

关于angular - material2数据表的使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45004524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com