开发者问题收集

父组件与子组件连接时出现空白页

2022-10-22
217

我试图将变量从父组件传递到子组件。为此,我想使用 @Input() 方法 ,但是当我尝试连接这两个组件时,整个网站都显示为空白页。简单地说,网站根本没有响应。

我将以下代码写入 parent.html

<app-test [id] = "id" [name]="name" [request]="request" [label]="label"></app-test>

然后,我将输入方法添加到 test.ts (child)

import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./test.component.css']
})
export class TestComponent implements OnInit {

  @Input() id =-1;
  @Input() name='';
  @Input() request='';
  @Input() label='';

  parameters:any=[];
  countryId:number=0;
  apiList:any;

  constructor() { }

  ngOnInit(): void {
  }

}

然后,我得到了一个空白页。开始时没有错误,但 30 秒后,我在检查器控制台中收到以下错误。你能帮助我吗?

Uncaught (in promise): RangeError: Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded

编辑:我的父组件:

import { Component, OnInit } from '@angular/core';
import {MenuItem} from 'primeng/api';
import { TheDataOfEverythingService } from 'src/app/service/the-data-of-everything.service';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {

  display:boolean = false;
  items: MenuItem[]=[];
  sidebarItems: MenuItem[]=[];
  id:number=-1;
  name:string='';
  request:string='';
  label:string='';

  constructor(private service:TheDataOfEverythingService) { }

  ngOnInit(): void {

    this.getApiList();

    this.items = [
      {
        label:'Home',
        icon:'pi pi-fw pi-home',
        routerLink: '/home'
      },
      {
        label:'Contact',
        icon:'pi pi-fw pi-phone',
        routerLink: ['/contact'],
      },
      {
        label:'Sign Up',
        icon:'pi pi-fw pi-user-plus'
      }
  ];
  
    this.sidebarItems = [
      {
      label:'World',
      icon:'pi pi-fw pi-globe',
      items: []
      },
    ]
  }


  apiList:MenuItem[]=[];
  getApiList(){
    this.service.getAllData("ApiList")
    .subscribe(data=> {
      this.apiList = data as MenuItem[];

      let index;
      this.apiList.forEach(item=>{
        const newMenuItem: MenuItem ={
          label: item.label,
          //icon: item.icon,
          routerLink: item.routerLink
        }
        if(newMenuItem.routerLink.includes('world')){
          index = this.sidebarItems.findIndex(e=> e.label == "World")
          this.sidebarItems[index].items?.push(newMenuItem);
        }
      })
    });
  }
}

编辑 2:我的父组件的 HTML:

<p-menubar [model]="items">
    <ng-template pTemplate="start">
        <a (click)="display = true">
            <img src="https://upload.wikimedia.org/wikipedia/commons/f/f2/Noun_Data_2223266.svg" height="40" class="mr-2">
        </a>
    </ng-template>
    <ng-template pTemplate="end">
        <input type="text" pInputText placeholder="Search">
    </ng-template>
</p-menubar>

<p-sidebar [(visible)]="display">
    <p-panelMenu [model]="sidebarItems" [style]="{'width':'280px'}"></p-panelMenu>
</p-sidebar>

<app-test [id] = "id" [name]="name" [request]="request" [label]="label"></app-test>
2个回答

test.component.html 中有什么?如果它是空的,那么您将得到一个空白页。

以下可能是您的控制台错误的答案: https://stackoverflow.com/a/6095695/20063801

Benjamin Sicard
2022-10-23

好的,我找到了解决方案。我将父组件用作整个网站的标题。因此,我也将其导入到子组件中。因此,我认为,当我还使用 @Input() 方法时,我创建了某种循环。并且由于此站点没有响应。

您可以在下面的 HTML 中看到 <app-header></app-header> 行。当我删除此行时,站点开始正常工作。

<app-header></app-header>

<body>
    <div class="text-center">
        <div class="row">
            <div class="col">
                <h1 class="display-6">Test</h1>
            </div>
        </div>
    </div>
    
</body>

因此,我将使用 @Output 方法代替此方法。

Tim's
2022-10-23