我有一个递归结构,由两个组件组成:
-
OptionsMenuComponent(A菜单)
-
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() { }
}
Menu Item: (模板组件)
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() { }
}
Note: 我删除了几乎所有逻辑和设计以简化,因为它不相关
正如您所看到的,OptionsMenuComponent知道MenuItemComponent,反之亦然 .
另外你可能已经注意到在MenuItemComponent中我在指令中使用了forwardRef . 没有它,当我加载页面时,我收到以下错误:
错误:未捕获(在承诺中):组件'MenuItemComponent'视图上的意外指令值'undefined'
目前它的编写方式(使用forwardRef)它工作得很好,但TSLint对它不满意并输出以下内容:
[gulp-tslint] error(no-forward-ref)menu-item.component.ts [9,18]:避免在类“MenuItemComponent”中使用forwardRef
我环顾网络寻找替代解决方案并空手而归 . 我能找到的只有两个建议:
-
我的解决方案与forwardRef
-
"You have a cyclic reference, you're doing something wrong so decouple them"(不是确切的单词)
第一个建议是有效的,但我的问题是,是否可以避免这种情况,因为它听起来不是一个好习惯(并且人们都说要避免它)
对于大多数情况,第二个建议是正确且易于实现的,但我如何在递归结构中使用(使用angular2组件)呢?
谢谢你,
p.s - 在此之前,我在一个组件中拥有所有功能,但我并没有建议这样做,因为在这里并非如此(试图保持组件小而简单)
TL;DR:
两个组件相互引用(需要递归结构) . 不使用forwardRef我得到错误,是否有一个不涉及使用forwardRef的替代解决方案?
1 回答
这是我写的递归导航的一个例子,剥离到有序列表 . 简而言之,您要定义一个递归模板,然后遍历根子项(页面集合)
context:{ $implicit: root.children }
,并在每个子项上,通过更改上下文context:{ $implicit: page.children }
来迭代根子项 .