typescript 在组件之间共享来自API的数据

dauxcl2d  于 2023-02-17  发布在  TypeScript
关注(0)|答案(1)|浏览(136)

我正在建立一个网站,展示排名前20的科幻电影。主页组件通过一个服务使用GET请求来获取包含电影数据的对象数组。该电影数据在其HTML模板中使用ngFor*呈现。
每个电影缩略图都有一个单击处理程序,该处理程序将路由到一个不同的页面,该页面将显示关于所选电影的更多信息--即描述、评级等。对于第二个页面,我使用了一个发出另一个GET请求的服务,其中查询包含所选电影的id作为参数。
呈现初始API电影数据的主页组件:

`
import { Component } from '@angular/core';
import { MovieDataService } from '../services/movie-data.service';

@Component({
  selector: 'home-card',
  templateUrl: './home-card.component.html',
  styleUrls: ['./home-card.component.css']
})
export class HomeCardComponent {

  movieData: any = {};
  constructor(private movieDataService: MovieDataService) {}

  ngOnInit(): void {
    this.movieDataService.getData().subscribe((data) => {
      this.movieData = data;
      // JSON to console
      console.warn(data);
    })
  }
}
`

主页的HTML:

`
<div class="wrapper-grid">
    <div *ngFor="let result of movieData.results;" class="container">
      <img routerLink="/movieInfo" src='https://image.tmdb.org/t/p/w780{{result.poster_path}}'   alt='thumbnail' class="thumbnail-img">
      <info-page [movieId]="result.id"></info-page>
      <p class="home-text">{{result.title}}</p>
      <p class="home-date">{{result.release_date}}</p>
    </div>
</div>
`

将呈现所选电影数据的单个电影页面

`
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { single } from 'rxjs';
import { DataService } from '../services/data.service';

@Component({
  selector: 'info-page',
  templateUrl: './info-page.component.html',
  styleUrls: ['./info-page.component.css']
})
export class InfoPageComponent {

  @Input()
  movieId: number;

  singleMovieData: any = {} ;

  constructor(private DataService: DataService) {}

  getMovie() {
    this.DataService.getMovie(this.movieId).subscribe((data: any) => {
      this.singleMovieData = data;
      // console.warn(data);
      // console.log(this.movieId)
      // console.log(this.singleMovieData.id)
    })
  }

  ngOnInit(): void {
    this.getMovie()
  }

}
`

单个电影页面的服务

`
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  constructor(private http: HttpClient) { }

  movieId: number;

  public getMovie(movieId: number) {
    return this.http.get(`https://api.themoviedb.org/3/movie/${movieId}?  api_key=9279f87c4b7f1cb1474b6d7cd6958a6d&language=en-US`);
  }

}
`

到目前为止,每个函数都工作正常-当记录movieId和singleMovieData时,我得到了我所寻找的正确信息。
但是当在服务中执行单个电影页面的GET请求时,我得到一个404,说明movieId的参数未定义。有人能帮我解决我在这里做错了什么吗?

6ie5vjzr

6ie5vjzr1#

DataService中的movieId属性未设置为在getMovie()方法中作为参数传递的值。因此,用于发出GET请求的API URL具有未定义的电影ID参数,导致404。
您应该从DataService类中删除movieId属性,并将movieId参数直接传递给getMovie()方法中的get()方法。传递给getMovie()方法的movieId参数将在API URL中用于发出GET请求。这应该可以解决404错误:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  constructor(private http: HttpClient) {}

  public getMovie(movieId: number) {
    return this.http.get(`https://api.themoviedb.org/3/movie/${movieId}?api_key=9279f87c4b7f1cb1474b6d7cd6958a6d&language=en-US`);
  }

}

相关问题