如何从列表组件中显示详细组件的数据?

Posted

技术标签:

【中文标题】如何从列表组件中显示详细组件的数据?【英文标题】:how can i display data in detail component from list component? 【发布时间】:2021-03-16 16:08:10 【问题描述】:

我无法将数据从一个组件显示到另一个组件。 我将我从服务中获取的数据放入 prova 并显示所有工作的列表。但我无法将“prova”上的数据传输到另一个组件,以通过它们自己的 id 显示详细信息。

这是我的 apicall 服务


import  Injectable  from '@angular/core';
import HttpClient,HttpClientModule,HttpResponse from '@angular/common/http';
import Observable from "rxjs";
import map from "rxjs/operators";
import results from "./results"


@Injectable(
  providedIn: 'root'
)
export class GetApiService 

  constructor(
    private http:HttpClient,
  )  


  apiCall():Observable<results[]>
  
    return this.http.get('https://www.themuse.com/api/public/jobs?category=Engineering&page=10')
    .pipe(map
    (
      (response:any) => 
        const data = response.results;
        console.log (data)
        return data ;
   
      
    )
    );
   

这是我观察到的结果

  export interface results
    
  categories : any;
company: string;
contents:string;
id : number;
 levels:string;
 locations:string;
 model_type: string;
 name: string;
 refs: string;
 short_name: string;
 type:string;

  

这是我的组件,其中有一个作品列表

import results from "../results";
import GetApiService from '../get-api.service';
import switchMap from "rxjs/operators";
import  Observable  from 'rxjs';
import  ActivatedRoute  from '@angular/router';


@Component(
  selector: 'app-work-list',
  templateUrl: './work-list.component.html',
  styleUrls: ['./work-list.component.css']
)
export class WorkListComponent implements OnInit 
   
  prova: results[]=[] ;
 item: any;
  selectedId: any ;
  constructor(
    private api :GetApiService,
    private route: ActivatedRoute,
  )  

  ngOnInit()

    this.api.apiCall()
    .subscribe
      (
        (data:results[]) => 
          this.prova=data;
        console.log (data);

        );



以及通过 id 连接的相应 html

    <div *ngFor="let item of prova " 
    [class.selected]="item.id === selectedId">
                      
    <a
    [routerLink]="['/details',item.id]">
    <h1>  item.name </h1>
    </a>
    <h1>  item.id </h1>
    <h1>  item.categories[0].name </h1>
    <h1>  item.name </h1>

      </div>

这是我无法用自己的详细信息显示所选作品的详细信息

import  ActivatedRoute  from '@angular/router';
import results  from '../results';
import GetApiService from '../get-api.service';
import switchMap from "rxjs/operators";


@Component(
selector: 'app-work-details',
templateUrl: './work-details.component.html',
styleUrls: ['./work-details.component.css']
)
export class WorkDetailsComponent implements OnInit 
@Input()
item: 
  categories: any;
  company: string;
  contents: string;
  id: number;
  levels: string;
  locations: string;
  model_type: string;
  name: string;
  refs: string;
  short_name: string;
  type: string;
 | undefined;
@Input ()
prova: results[]=[];
selectedId:string | undefined;
constructor(
  private route: ActivatedRoute,
  private api: GetApiService,
)  

ngOnInit():void 

   this.route.paramMap.subscribe
    (params => 
      this.item=this.prova[+params.get('selectedId')];

**// it should  be somewthing like this but prova is empty.**
      
    )
  ;


【问题讨论】:

【参考方案1】:

您似乎在混合使用两种不同的机制?

其中一个是父 -> 子组件关系,您的 WorkDetailsComponent@Input() 对应于 prova,但同时,鉴于您的 &lt;a [routerLink]="['/details',item.id]"&gt;,看起来该组件是它自己的页面以及this.route.paramMap.subscribe...的用法。

可以肯定的是,你不能同时拥有它。

您可以转到父组件 -> 子组件,在其中使用 @Input()s 传递相关详细信息:

<div *ngIf="selectedItem">
  <app-work-details [prova]="prova" [selectedItem]="selectedItem"></app-work-details>
</div>

或者您使用单独的页面路由,可以通过以下两种方式之一完成:

    将该服务用作共享服务;让它记住状态(prova),以便在详细信息页面加载时,它可以请求相关 id 的数据。

    通过路由参数传递附加数据

对于 1,它看起来像:

private prova: results[]; // Save request response to this as well

public getItem(id: number): results 
  return this.prova.find(x => x.id === id);

然后当您加载详细信息页面时:

ngOnInit():void 

   this.route.paramMap.subscribe
    (params => 
      this.selectedId=+params.get('selectedId');

   this.item = this.service.getItem(this.selectedId);
      
    );

对于 2,它涉及使用附加数据进行路由,如下所示:

<a [routerLink]="['/details',item.id]" [state]=" data: prova">..</a>

article 更详细地展示了在组件之间获取数据的各种方法。

【讨论】:

以上是关于如何从列表组件中显示详细组件的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在模板中显示单个 JSON 对象

在另一个组件中显示所选列表项值[关闭]

如果子项从 RTK 查询中的获取请求更新,我如何更新列表中的数据

如何从使用状态挂钩的功能性父组件传递道具?

如何从不是父或子的另一个组件更改功能组件的状态?

如何从 Angular 7 的组件列表中预先选择默认项