嵌套组件如何在角度 5 或 6 中工作

Posted

技术标签:

【中文标题】嵌套组件如何在角度 5 或 6 中工作【英文标题】:How does nested component work in angular 5 or 6 【发布时间】:2018-12-21 21:25:23 【问题描述】:

我试图了解两个或多个组件如何以角度相互通信。因此,在创建了一个 Angular 项目后,我只创建了四个新组件,分别命名为一、二、三和四。

之后,我试图在 app.component.html 中添加这段代码

<app-one> 
    <app-two>
        <app-three> </app-three>
    </app-two>
     <app-four> </app-four>
</app-one>

所有组件都具有以下相同的类:

    import  Component, OnInit  from '@angular/core';

@Component(
  selector: 'app-one-child',
  templateUrl: './one-child.component.html',
  styleUrls: ['./one-child.component.css']
)
export class OneChildComponent implements OnInit 

  constructor()  

  ngOnInit() 
  


通过这样做,我认为 One 将成为所有这些组件的父组件,并且所有组件都将呈现。但不幸的是,我只得到了

one works!

而其他组件根本不渲染。我确信我在角度及其工作方式方面遇到了一些严重的问题。你能解释一下为什么它不渲染来自二、三和四的数据吗?如果我想让他们工作我该怎么办?

【问题讨论】:

您的组件类中有哪些代码? @codeVerses 我已经更新了班级信息。请看一看。我刚刚用 ng g c one 创建了所有组件,依此类推。那里没什么好看的。只有新的组件。 【参考方案1】:

理想情况下,每个组件模板都负责自己的 html。 IMO 这将是处理此问题的最佳方式。

见stackblitz

根组件的模板

@Component(
  selector: '',
  template: '<app-one></app-one>'
)
export class RootComponent

组件 1 的模板

@Component(
  selector: 'app-one',
  template: '<app-two></app-two><app-four></app-four>'
)
export class Child1Component

组件 2 的模板

@Component(
  selector: 'app-two',
  template: '<app-three></app-three>'
)
export class Child2Component

组件 3 的模板

@Component(
  selector: 'app-three',
  template: '<h1>Hi there from 3</h1>'
)
export class Child3Component

组件 4 的模板

@Component(
  selector: 'app-four',
  template: '<h1>Hi there from 4</h1>'
)
export class Child4Component

【讨论】:

非常感谢。但是你能告诉我为什么上面的方法不起作用吗?是不是因为组件一类不知道其他类? @Kazi - 查看我刚刚添加的链接stackblitz。 @Kazi 它不起作用,因为包含。请参阅下面关于 ng-content 的答案。【参考方案2】:

如果您需要嵌套组件,请在父组件中使用ng-content,例如

@Component(
  selector: 'root',
  template: '<div>I'm root, <ng-content></ng-content></div>'
)
export class RootComponent


@Component(
  selector: 'child',
  template: '<root>I'm children in the root</root>'
)
export class ChildComponent

等等..

See stack blitz

然后在你的模板中,你可以写:

<child></child>

它将呈现I'm root, I'm children in the root

或者

<root>Hello world!</root>

它将呈现I'm root, Hello World!

Here is a great article about using ng-content (transclusion)

【讨论】:

以上是关于嵌套组件如何在角度 5 或 6 中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何以角度动态创建 n 级嵌套展开/折叠组件

EL 空运算符如何在 JSF 中工作?

如何让 HTML 5 输入 type="date" 在 Firefox 和/或 IE 10 中工作

嵌套null合并运算符(??)如何在PHP中工作?需要逐步解释执行流程

如何使 Snackbar 在类组件中工作?

运行队列如何在 Snowflake 中工作?是不是有概念时间片?