Angular2在带有参数的组件内调用组件

Posted

技术标签:

【中文标题】Angular2在带有参数的组件内调用组件【英文标题】:Angular2 calling component within component with parameter 【发布时间】:2016-11-01 17:21:34 【问题描述】:

我有一个带有 cmets 的详细信息页面。对于单个评论,我创建了一个 @Component。诀窍是,每个评论都可以有 child-cmets。

这是我的 details.html 的样子:

some info here...
<single-comment ngFor... [comment]="'hi comment'"></single-comment>

single-comment.html 看起来像:

<ion-item no-padding>
  <small dark>
    <strong>comment</strong>
  </small>
  <ng-content></ng-content>
  <single-comment [comment]="'ANOTHER comment'"></single-comment>
</ion-item>

组件本身:

@Component(
  selector: 'single-comment',
  templateUrl: 'single-comment.html'
)
export class SingleComment 
  @Input() comment: string;

  constructor() 
  

  ngAfterContentInit() 
        console.log('new comment', this.comment);
  

问题是,第二个。 child-component 永远不会被调用。

我还创建了一个 Plunkr 代码,可以更好地显示示例。 Plunkr 在这里可见:https://plnkr.co/edit/w5kWE6QdbEoXIpqLI4dc?p=preview。 plunkr 示例中的“详细信息”页面是 home.html,其中还包含 @Component 本身。

这是一个 Angular2 错误还是根本不可能发生这种行为?我的解决方案是显示一个嵌套的 cmets,但由于我无法加载第二条评论,我有点走投无路了。

是否有解决方案或只是更好的方法来实现我想要做的事情?

感谢大家的帮助。

【问题讨论】:

因此,如果我理解正确,您目前正在尝试在定义单注释指令的 html 中使用单注释指令? - 这意味着(如果这要成功)你将创建一个无限循环的 cmets,上面写着“另一个评论” 听起来你正在寻找类似***.com/questions/37746516/use-component-in-itself/…的东西 @JarodMoser 完全正确。在这种情况下,我会得到一个无限循环。在我的模板中添加一个简单的 if 语句来检查当前评论是否有子 cmets,将解决这个问题。 【参考方案1】:

更新

随着@NgModule 的引入以及directives@NgModule 的迁移,forwardRef 应该不再需要了。

原创

如果你想在自身内部使用一个组件(递归),你需要像任何其他组件或指令一样将它添加到providers,因为@Component() 装饰器位于类之前,并且不能在它之前引用该类声明你还需要forwardRef

import Component, forwardRef, Input from '@angular/core'

@Component(
  selector: 'single-comment',
  templateUrl: 'single-comment.html',
  directives: [forwardRef(() => SingleComment)]
)
export class SingleComment 
  @Input() comment: string;

  constructor() 
  

  ngAfterContentInit() 
        console.log('new comment', this.comment);
  

您还需要确保递归在某处结束,否则您将获得堆栈溢出。在 Plunker 中使用 *ngIf:

Plunker example

【讨论】:

非常感谢 Günther。这正是我正在寻找的。因为我已经发布了非常简单的 plunker,没有任何 if 语句,它看起来就像一个永远不会结束的递归,确切地说。我已经从模板中删除了代码的那些部分,我检查 currentComment 是否有 subComments。如果是这样,我再次使用&lt;single-comment&gt; 指令。我尝试添加directives: [SingleComment],但这完全破坏了应用程序,我无法再访问详细信息应用程序了。没有错误或在控制台中打印任何内容。感谢您提供完美的例子。

以上是关于Angular2在带有参数的组件内调用组件的主要内容,如果未能解决你的问题,请参考以下文章

使用构造函数参数测试 Angular 2 组件

从 Angular2 路由中的子组件调用 router.parent.navigate 方法时未触发组件构造函数和路由器生命周期挂钩

自定义 angular2 表单输入组件,在组件内具有两种方式绑定和验证

Angular 2+ 组件内的 Chrome (Android) 视频自动播放

在组件中调用带参数的函数

测试使用 setInterval 或 setTimeout 的 Angular2 组件