Angular: API 基于输入更改的请求

Angular: API request based on Input changes

我正在使用 SWAPI api(星球大战)进行一些测试;我的目标是在用户单击角色列表时调用 api,这样也可以显示该角色参与过的电影列表。我试图通过 ngOnChanges 挂钩来实现这一点,因为我使用的是没有路由的细节组件。这是它在代码中的样子:

电影组件 TS:

export class MoviesComponent implements OnInit {
  selectedP
  planets: any[];
  films: any[]
  constructor(private ms: MoviesService) { }

  ngOnInit(): void {
    this.ms.getPlanets()
      .subscribe(data => {
        this.planets = data;
        this.planets.map(m => this.films = m['films'])
      })

  }


  selectCharacter(caracter: any) {
    this.selectedP = caracter;
  }
}

电影HTML

 <div class="col-md-3" *ngIf="planets">

            <ul class="list-group" *ngFor="let p of planets">
                <a
                class="list-group-item list-group-item-action"
                (click)="selectCharacter(p)"

                [class.active]="selectedP===p">
                    {{p.name}}
                </a>
            </ul>
        </div>
        <div class="col-md-6">
            <app-detail-no-routing [character]="selectedP" [films]="films"></app-detail-no-routing>
        </div>

服务:

getPlanets(){
    return this.http.get('https://swapi.dev/api/people/')
    .pipe(map(p=>{
      let pl:any[]=p['results']
      return pl;
    }))
  }
  getCharacterMovies(url:string){
   return this.http.get(url)
  }
}

服务中的主要方法应该是getPeople。不管怎样,首先我调用 people 端点来检索带有嵌套数组的对象,所以我让 map 运算符只有一个结果数组,这就是我在组件中订阅的内容。在该订阅中,我有第二张地图,因此我只能拥有每个角色参与其中的电影数组。到目前为止一切顺利。我可以渲染所有角色并且准备好电影数组。然后我将所有这些传递给输入装饰器,并填充子组件中的数组:

export class DetailNoRoutingComponent implements OnInit, OnChanges {
  @Input() character: any;
  @Input() films:any;
  value:any;
  url:any;
  participations:string[];
  constructor(private movieService:MoviesService) { }




  ngOnChanges(changes: SimpleChanges) {
    if (changes['character']) {
      this.value=changes['character']['currentValue']
      this.url=this.value['films']
      this.url.forEach((value)=> {
        this.movieService.getCharacterMovies(value).subscribe(data=>{
          this.participations=(data['title']);

            console.log(typeof this.participations)

        })
      });
    }
  }

HTML:

<h4 *ngIf="character">Movies participation</h4>
<p >{{participations}}</p>

所以,当我点击不同的角色时,我想显示他看过的电影。实际上,我只得到了角色所在的最后一部电影,日志向我显示了所有电影,但只是字符串形式,如果我遍历它们,我会得到字符......所以发生了一些事情,我可以'不知道是什么...有人可以给我提示吗?

在movie.component.ts变化

ngOnInit(): void {
    this.ms.getPlanets()
      .subscribe(data => {
        this.planets = data;
        this.planets.map(m => this.films = m['films'])
      })

  }

ngOnInit(): void {
    this.ms.getPlanets()
      .subscribe(data => {
        this.planets = data;
        this.films = this.planets.map(m => m['films'])
      })

  }

并将您的 ngOnChanges 更改为:-

ngOnChanges(changes: SimpleChanges) {
    if (changes['character']) {
      this.value=changes['character']['currentValue']
      this.url=this.value['films']
      this.participations = [];
      this.url.forEach((value)=> {
        this.movieService.getCharacterMovies(value).subscribe(data=>{
          this.participations.push(data['title']);
            console.log(typeof this.participations)

        })
      });
    }
  }