У меня есть угловое приложение, которое отображает несколько таблиц мат на странице.Вот как выглядит json.
"job-detail":
{
"JobId": "480960",
"jobDocMetadata":
[
{
"seq": "1",
"docID": "524126",
"type": "Print",
"title": "Sample"
},
{
"seq": "2",
"docID": "524125",
"type": "Print",
"title": "Sample"
}
],
"jobStatusHistory":
[
{
"date": "12-04-2018 12:47:16 CST",
"code": "200",
"jobStatus": "Job Undergoing Composition",
"description": "received a new job"
},
{
"date": "12-04-2018 12:48:14 CST",
"code": "315",
"jobStatus": "Job successfully delivered",
"description": "job finished,"
}
],
}
Я пытаюсь отобразить данные из jobDocMetadata и jobStatusHistory в 2 отдельных таблицах mat на одной странице.Вот служба, которая получает данные от службы отдыха.
findJobDetail(jobID: number): Observable<JobDetail> {
return this.httpClient.get<JobDetail>(`${this.JOB_DETAIL_URL}`, customHttpOptions).pipe(
tap(_ => this.log(`Found Job`)),
catchError(this.handleError<any>('findJobDetail')),
);
}
И это пока код компонента, подписка на наблюдаемое, и он работает нормально.
public jobDetailObs: Observable<JobDetail>;
public jobDetail: JobDetail;
jobDocMetadataDS: MatTableDataSource<JobDocMetadata>;
jobStatusHistoryDS: MatTableDataSource<JobStatusHistory>;
@ViewChildren(MatSort)
sort = new QueryList<MatSort>();
this.apiService.findJobDetail(this.id).subscribe(
data => {
this.jobDetail = data as JobDetail;
this.jobDocMetadataDS = new MatTableDataSource(this.jobDetail.jobDocMetadata);
this.jobDocMetadataDS.sort = this.sort.toArray()[0];
this.jobStatusHistoryDS = new MatTableDataSource(this.jobDetail.jobStatusHistory);
this.jobStatusHistoryDS.sort = this.sort.toArray()[1];
}
)
Вот пример шаблона.
<h2 class="mat-h2 subheader">Job Document Metadata</h2>
<div class="mat-elevation-z8">
<mat-table #table [dataSource]="jobDocMetadataDS" matSort>
<ng-container matColumnDef="seq">
<mat-header-cell *matHeaderCellDef mat-sort-header> Seq </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.seq}}</mat-cell>
</ng-container>
<ng-container matColumnDef="docID">
<mat-header-cell *matHeaderCellDef mat-sort-header> Doc ID </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.docID}}</mat-cell>
</ng-container>
Я пытаюсь изменить этот код для использования асинхронных каналов, поскольку он предпочтительнее, чем подписка на наблюдаемое.Для этого я пытаюсь связать свои источники данных с Observable.
this.jobDetailObs = this.apiService.findJobDetail(this.id).pipe(share());
Поэтому мой вопрос заключается в том, как я могу связать 2 источника данных с Observable из JobDetail.Я не мог связать Observable напрямую с источником данных, так как нужные мне данные находятся внутри JobDetail.Поэтому я думаю преобразовать Observable of JobDetail в объект JobDetail (jobDetailObs to jobDetail) для достижения этого отображения.Это лучший способ сделать это, и если да, то как мне этого добиться?