我有一个由两个组件组成的递归结构:
- OptionsMenuComponent(一个菜单)
- MenuItemComponent(菜单项)
OptionsMenuComponent:( 模板+组件)
Template:
<menu-item *ngFor="let menuItem of menu.menuItems" [menuItem]="menuItem"> </menu-item>
Component:
import { Component, Input } from '@angular/core';
import { Menu } from '../models/menu.model';
import { MenuItemComponent } from '../menu-item/menu-item.component';
@Component({
moduleId: __moduleName,
selector: 'options-menu',
templateUrl: 'options-menu.component.html',
styleUrls: ['options-menu.component.css'],
directives: [MenuItemComponent],
})
export class OptionsMenuComponent {
@Input() menu: Menu;
constructor() { }
}
菜单项:(模板+组件)
Template:
<span class="menu-item-title">{{menuItem.title}}</span>
<options-menu *ngIf="menuItem.subMenu != null" [menu]="menuItem.subMenu" class="sub-menu"> </options-menu>
Component:
import { Component, Input, forwardRef } from '@angular/core';
import { MenuItem } from '../models/menu-item.model';
import { OptionsMenuComponent } from '../options-menu/options-menu.component';
@Component({
moduleId: __moduleName,
selector: 'menu-item',
directives: [forwardRef(() => OptionsMenuComponent)],
templateUrl: 'menu-item.component.html',
styleUrls: ['menu-item.component.css'],
})
export class MenuItemComponent {
@Input() menuItem: MenuItem;
constructor() { }
}
注意:我删除了几乎所有的逻辑和设计以简化,因为它不相关
如您所见, OptionsMenuComponent 知道 MenuItemComponent ,反之亦然。
此外,您可能已经注意到,在 MenuItemComponent 中,我在指令中使用了 forwardRef。没有它,当我加载页面时,我会收到以下错误:
错误:未捕获(承诺中):组件“MenuItemComponent”视图上的意外指令值“未定义”
目前它的编写方式(使用 forwardRef)效果很好,但 TSLint 对此不满意并输出以下内容:
[gulp-tslint] 错误 (no-forward-ref) menu-item.component.ts[9, 18]:避免在“MenuItemComponent”类中使用 forwardRef
我在网上四处寻找替代解决方案,但空手而归。我能找到的只有两个建议:
- 我使用 forwardRef 的解决方案
- “你有一个循环引用,你做错了什么,所以将它们解耦”(不是确切的词)
第一个建议有效,但我的问题是是否可以避免这种情况,因为这听起来不像是好的做法(而且人们到处都说要避免它)
对于大多数情况,第二个建议是正确且易于实现的,但是我如何在递归结构中做到这一点(使用 angular2 组件)?
提前谢谢,
ps - 在此之前,我在一个组件中拥有所有功能,并且我对引用自身的单个组件没有任何问题(不需要 forwardRef)所以请不要推荐这样做,因为这里不是这种情况(试图保持组件小而简单)
TL;DR:
两个组件相互引用(需要递归结构)。不使用 forwardRef 我得到错误,是否有不涉及使用 forwardRef 的替代解决方案?