新手问题:Angular - 将数据从 parent 传递到 child

Newbie Question: Angular - Passing of data from parent to child

我正在尝试通过几个 Angular 在线课程在 运行 之后创建我的第一个应用程序,所以我对此很陌生。

我想做什么:

我正在尝试创建一个 table,它有一个应用程序名称的标题,并且在每个应用程序名称下都有一个组成该应用程序的组件的列表。因此,每个应用程序至少要在其下列出一个组件。

我有 3 个组成部分:

我的计划是让 APP 调用 API 并检索应用程序列表(id 和名称)(比方说 3)。然后,我试图调用另一个 API,它将从 APPLICATION ITEMS 组件中检索该特定应用程序的项目列表,并将它们显示在组件 APPLICATION ITEMS 的 table 下。

有什么问题?

第一部分有效,我将应用程序名称传递给组件。 失败的部分是我尝试调用第二个 API 来检索项目的地方。 我似乎无法获得从 parent 传递下来的 ID 以包含在 API 调用中。

app.component.ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  appURL: string = 'http://localhost:3333/application'
  appsName = []
  appsID = []

  constructor(private http: HttpClient) {

    this.http.get(this.appURL).toPromise().then(data => {

      for (let key in data){
        if (data.hasOwnProperty(key)){
           this.appsID.push(data[key].id)
          console.log("ID = " + data[key].id)
          this.appsName.push(data[key].name)
          console.log("Name = " + data[key].name)
        } 
      }  

    })
  }
}

*控制台returns:

ID = 1
Name = This Website
ID = 2
Name = Google
ID = 3
Name = My Website

applicationitems.component.ts

import { Component, Input } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-statuscarditems',
  templateUrl: './statuscarditems.component.html',
  styleUrls: ['./statuscarditems.component.css']
})

export class StatuscarditemsComponent {

  @Input() appsID: number

  appURL: string = 'http://localhost:3333/application/item/' + this.appsID
  appItems = []

  constructor(private http: HttpClient) {

    // Retrieve List of Applications from the database
    this.http.get(this.appURL).toPromise().then(data => {

      for (let key in data){
        if (data.hasOwnProperty(key)){
          this.appItems.push(data[key].name)
          console.log("Name = " + data[key].name)
        } 
      }
    })
  }
}

本例中的URL变为:http://localhost:3333/application/item/undefined

我知道我的方法是错误的,但作为一个新手,我正在努力找出我哪里出错了,这很令人沮丧,因为我知道这应该很容易,而且对我来说非常明显。

如有任何帮助,我们将不胜感激。提前致谢。

编辑: app.component.html

<div class="container">
  <h1 align="center">Applications and Components</h1>
  <!--<app-registerapp></app-registerapp> -->

  <div class="row col-sm">
    <table class="table">
        <tr><td *ngFor="let app of appsName"><app-statuscard [appsName]="app"></app-statuscard></td></tr>
        <tr><td><app-statuscarditems></app-statuscarditems></td></tr>
    </table>
  </div>

</div>

(我知道我还没有完成我的第二个 *ngFor - 但一旦我可以检索数据我就会改变)

您正在尝试在分配之前使用 this.appId。您的构造函数将在分配 appId 之前被调用,这意味着 url 将在那时出错。

我的建议是在您的输入中添加一个 setter。使用 setter,一旦定义了值,您就可以使用 retreiveData() 和右边的 url 进行 http 调用。您还可以添加一个条件,以防由于某种原因数字未定义但我没有提供。

_appId: number
appURL: string
@Input() set appsID(id: number) {
    this._appId = id; //pretty much useless here
    this.appURL = 'http://localhost:3333/application/item/' + id
    this.retreiveData();
}

retreiveData() {
    this.http.get(this.appURL).toPromise().then(data => {
      for (let key in data){
        if (data.hasOwnProperty(key)){
          this.appItems.push(data[key].name)
          console.log("Name = " + data[key].name)
        } 
      }
    })
}

您需要将 id 作为输入传递给子组件

<tr><td *ngFor="let id of appsID"><app-statuscarditems [appsId]=id></app-statuscarditems></td></tr>