gpt4 book ai didi

angular - 如何在 Angular 4 中将 md-table 与服务一起使用

转载 作者:太空狗 更新时间:2023-10-29 17:02:38 24 4
gpt4 key购买 nike

我是 Angular 世界的新手,我正在尝试将 Angular Material 2 中的新 md-table 组件与 Angular 4 一起使用。

我已经通过 API 提供了一项服务,该服务可检索简单的内容数组。现在我正在尝试将此服务用作 md 表的数据源,但我找不到从该服务获取数据的方法(它总是返回一个空数组)。

请注意,在使用 md-table 之前,我已经在使用该服务并且它工作正常。

这是组件的代码:

import { Component, OnInit, ViewChild } from '@angular/core';
import {DataSource} from '@angular/cdk';
import {MdPaginator} 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';

import { GroupService } from '../shared/group.service';
import { Group } from '../shared/group';

@Component({
selector: 'app-group-list',
templateUrl: './group-list.component.html',
styleUrls: ['./group-list.component.css'],
providers: [GroupService]
})
export class GroupListComponent implements OnInit{

public DisplayedColumns = ['name', 'email', 'directMembersCount'];
public groupDatabase = new GroupDatabase();
public dataSource : CustomDataSource | any;

@ViewChild(MdPaginator) paginator : MdPaginator;

constructor() {}

ngOnInit() {
this.dataSource = new CustomDataSource(this.groupDatabase, this.paginator);
console.log(this.dataSource);
}

}

export class GroupDatabase implements OnInit {

public dataChange: BehaviorSubject<Group[]> = new BehaviorSubject<Group[]>([]);
get data(): Group[] { return this.dataChange.value }

private _groupService : GroupService

private getAllGroups(){
return this._groupService
.getAllGroups();
}

constructor (){}

ngOnInit() {
this.getAllGroups();
console.log(this.getAllGroups());
}
}

export class CustomDataSource extends DataSource<any> {

constructor(private _groupDatabase = new GroupDatabase(), private _paginator: MdPaginator){
super();
}

connect(): Observable<Group[]> {
const displayDataChanges = [
this._groupDatabase.dataChange,
this._paginator.page
];
return Observable.merge(...displayDataChanges).map(() => {
const data = this._groupDatabase.data.slice();
console.log(data);

const startIndex = this._paginator.pageIndex * this._paginator.pageSize;
return data.splice(startIndex, this._paginator.pageSize);
})
}

disconnect() {}
}

这是 HTML 的代码:

<md-table #table [dataSource]="dataSource">

<ng-container *cdkColumnDef="name">
<md-header-cell *cdkCellDef>Nom</md-header-cell>
<md-cell *cdkCellDef="let row"> {{row.name}} </md-cell>
</ng-container>

<ng-container *cdkColumnDef="email">
<md-header-cell *cdkCellDef>Email</md-header-cell>
<md-cell *cdkCellDef="let row"> {{row.email}} </md-cell>
</ng-container>

<ng-container *cdkColumnDef="directMembersCount">
<md-header-cell *cdkCellDef>Nombre de membres</md-header-cell>
<md-cell *cdkCellDef="let row"> {{row.directMembersCount}} </md-cell>
</ng-container>

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

</md-table>

<md-paginator #paginator
[length]="groupDatabase.data.length"
[pageIndex]="0"
[pageSize]="25"
[pageSizeOptions]="[5, 10, 25, 100]">
</md-paginator>

相关服务:

private groupApiUrl: string;
private groupsApiUrl: string;
private headers: Headers;
constructor(public http:Http, private config: Config) {
this.groupApiUrl = config.serverWithApi + "group";
this.groupsApiUrl = config.serverWithApi + "groups";

this.headers = new Headers();
this.headers.append('Content-Type', 'application/json');
this.headers.append('Accept', 'application/json');
}

public getAllGroups = (): Observable<Group[]> => {
return this.http.get(this.groupsApiUrl)
.map((response: Response) => <Group[]>response.json())
.catch(this.handleError)
}

我不确定我应该如何使用数据源调用服务,这就是为什么我像以前那样做;使用 ngOnInit 方法。

谢谢你的帮助。

最佳答案

这是通过 HTTP 检索数据的示例:https://plnkr.co/edit/mjQbufh7cUynD6qhF5Ap?p=preview


您遗漏了一段,其中 GroupDatabase 没有将任何数据值放在 dataChange 流上。它是一个以空数组开头的 BehaviorSubject,但您没有在其上放置任何更多数据。这就是表格只接收空数组的原因。

首先,知道 ngOnInit 不会被 Angular 调用,因为 GroupDatabase 不是指令,也不是变更检测周期的一部分。

相反,将 this.getAllGroups() 移动到 GroupDatabase 的构造函数中。然后订阅它的结果:

export class GroupDatabase {
public dataChange: BehaviorSubject<Group[]> = new BehaviorSubject<Group[]>([]);
get data(): Group[] { return this.dataChange.value }

constructor(groupService: GroupService) {
groupService.getAllGroups().subscribe(data => this.dataChange.next(data));
}
}

或者,完全摆脱 GroupDatabase,让您的 CustomDataSource 直接调用您的 GroupService。

export class CustomDataSource extends DataSource<Group> {

constructor(
private _groupService: GroupService,
private _paginator: MdPaginator) { }

connect(): Observable<Group[]> {
const displayDataChanges = [
this._groupService.getAllGroups(),
this._paginator.page
];

return Observable.merge(...displayDataChanges).map((data, page) => {
const clonedData = data.slice();

const startIndex = this._paginator.pageIndex * this._paginator.pageSize;
return data.splice(startIndex, this._paginator.pageSize);
})
}

disconnect() {}
}

关于angular - 如何在 Angular 4 中将 md-table 与服务一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45014257/

24 4 0