解决@ContentChild / @ContentChildren

时间:2018-11-22 14:45:51

标签: angular typescript

我有两个非常简单的组件,它们位于两个不同的文件中。 MenuItem 可以包含一个 MenuGroup ,它是更多 MenuItem 的列表。如果MenuItem不包含MenuGroup,则它将是终结点项目。

这将帮助我构建一个任意嵌套的导航菜单,如下所示:

// template of some navigation menu component

...
<app-menu-group>

  <app-menu-item title="Europe">
    <app-menu-group>
      <app-menu-item title="United Kingdom"></app-menu-item>
      <app-menu-item title="Germany"></app-menu-item>
    </app-menu-group>
  </app-menu-item>

  <app-menu-item title="America">
  </app-menu-item>

</app-menu-group>

当您查看我的两个不同文件时,就会出现问题。它们相互导入,由于检测到循环依赖而导致编译器失败。

// menu-item.component.ts

import { ... } from '@angular/core';
import { MenuGroupComponent } from './menu-group.component';

@Component({
  selector: 'app-menu-item',
  template: ``,
  styles: [``]
})
export class MenuItemComponent {

  @ContentChild(forwardRef(() => MenuGroupComponent)) menuGroup?: MenuGroupComponent;

  @Input() title: string;

}

menu-group.component.ts

import { ... } from '@angular/core';
import { MenuItemComponent } from './menu-item.component';

@Component({
  selector: 'app-menu-group',
  template: ``,
  styles: [``]
})
export class MenuGroupComponent {

  @ContentChildren(forwardRef(() => MenuItemComponent)) menuItems: QueryList<MenuItemComponent>;

}

理论上,由于 forwardRef ,Angular应该已经解决了循环问题,这使我可以为两个组件引用尚未定义的类。问题是Typescript编译器还是很生气。

最奇怪的是,这 perfectly 完全可以在StackBlitz(我用来开发原型)上工作,而在AngularCLI编译器中却无法使用。

---> This is the StackBlitz. <---

特别有趣的地方:

将类放在同一文件中,可以解决编译问题,但会导致运行时错误,例如 forwardRef 无法正常工作。

0 个答案:

没有答案