gpt4 book ai didi

angular - 如何在服务的 md-table 中实现 md-paginator 和 md-sort?

转载 作者:太空狗 更新时间:2023-10-29 19:34:15 24 4
gpt4 key购买 nike

我是新手,我设法用服务提供的数据实现了我的 md-table。现在我正在尝试实现过滤器、排序和分页功能,但我认为我做错了什么。

这是我的组件:

import { Component, OnInit, ViewChild }  from '@angular/core';
import { DataSource } from '@angular/cdk';

import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { MdPaginator } from '@angular/material';

import { Competition } from '../../competition/competition';
import { CompetitionService } from '../../competition/competition.service'

import 'rxjs/add/operator/startWith';
import 'rxjs/add/observable/merge';
import 'rxjs/add/operator/map';

@Component({
selector: 'comp-table-cmp',
moduleId: module.id,
templateUrl: 'competitions-table.component.html',
})

export class CompetitionsTableComponent{

displayedColumns = ["compName", "compChamp", "compRunnerup"];
dataSource: CompetitionsDatasource | null;

constructor(private competitionService: CompetitionService){ }

@ViewChild(MdPaginator) paginator: MdPaginator;

ngOnInit() {
this.dataSource = new CompetitionsDatasource(this.competitionService, this.paginator);
console.log(this.dataSource)
}
}

export class CompetitionsDatasource extends DataSource<any> {
constructor(private competitionService: CompetitionService, private paginator: MdPaginator) {
super();
}

subject: BehaviorSubject<Competition[]> = new BehaviorSubject<Competition[]>([]);
get data(): Competition[] { return this.subject.value; }

connect(): Observable<Competition[]> {
const displayDataChanges = [
this.competitionService.getCompetitions()
.then(res => {
this.subject.next(res);
}),
this.paginator.page,
];
return Observable.merge(this.subject).map(() => {
const data = this.subject.data.slice();

// Grab the page's slice of data.
const startIndex = this.paginator.pageIndex * this.paginator.pageSize;
return data.splice(startIndex, this.paginator.pageSize);
});
}

disconnect() {
this.subject.complete();
this.subject.observers = [];
}
}

这是提供数据的服务:

import { Injectable }    from '@angular/core';
import { Headers, Http, RequestOptionsArgs, URLSearchParams } from '@angular/http';

import 'rxjs/add/operator/toPromise';

import { Competition } from './competition';
import { Match } from '../match/match';

@Injectable()
export class CompetitionService {

private headers = new Headers({'Content-Type': 'application/json'});
private competitionsUrl = 'api/competitions'; // URL to web api

constructor(private http: Http) { }

getCompetitions(): Promise<Competition[]> {
let options: RequestOptionsArgs = {};
let params = new URLSearchParams();
params.append('size', '250');
options.params = params;
return this.http.get(this.competitionsUrl,options)
.toPromise()
.then(response => response.json()._embedded.competitions as Competition[])
.catch(this.handleError);
}
}

我尝试了很多东西,总是在组件的 connect() 函数中实现我的更改。虽然我开始认为我应该修改服务。

我认为我面临的问题是:

const data = this.subject.data.slice();

主题中没有“数据”,当然也没有“切片”。

有什么想法吗?我走在正确的道路上吗?

最佳答案

您的 competitionService.getCompetitions() 永远不会被调用。

您应该按如下方式合并 displayDataChanges:

return Observable.merge(...displayDataChanges).map(() => {
const data = this.subject.data.slice();

// Grab the page's slice of data.
const startIndex = this.paginator.pageIndex * this.paginator.pageSize;
return data.splice(startIndex, this.paginator.pageSize);
});

这会解决您的问题。

关于angular - 如何在服务的 md-table 中实现 md-paginator 和 md-sort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45524467/

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