Angular 9:使用组件作为指令

Win*_* Li 3 angular angular9 angular10

最近我在阅读 Nebular(一个 Angular ui 框架)的源码,我对以下代码有疑问:

@Component({
  selector: '[nbMenuItem]',
  templateUrl: './menu-item.component.html',
  animations: [
    ...
  ],
})
export class NbMenuItemComponent implements DoCheck, AfterViewInit, OnDestroy {
  @Input() menuItem = <NbMenuItem>null;

  @Output() hoverItem = new EventEmitter<any>();
  @Output() toggleSubMenu = new EventEmitter<any>();
  @Output() selectItem = new EventEmitter<any>();
  @Output() itemClick = new EventEmitter<any>();
Run Code Online (Sandbox Code Playgroud)

这应该是一个组件,它的使用方法如下:

@Component({
  selector: 'nb-menu',
  styleUrls: ['./menu.component.scss'],
  template: `
    <ul class="menu-items">
      <ng-container *ngFor="let item of items">
        <li nbMenuItem *ngIf="!item.hidden"
            [menuItem]="item"
            [class.menu-group]="item.group"
            (hoverItem)="onHoverItem($event)"
            (toggleSubMenu)="onToggleSubMenu($event)"
            (selectItem)="onSelectItem($event)"
            (itemClick)="onItemClick($event)"
            class="menu-item">
        </li>
      </ng-container>
    </ul>
  `,
})
export class NbMenuComponent implements OnInit, AfterViewInit, OnDestroy {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么nbMenuItem 可以用作指令,它是用@Component注解的,为什么?我在角度文档中没有找到任何与此相关的内容。

Edw*_*ard 8

所有组件都是指令,但并非所有指令都是组件。即组件是带有模板的指令。如角度文档中所定义

话虽如此,您可以使用 nbMenuItem 作为 DOM 元素的属性的主要原因是NbMenuItemComponent.

通过在选择器周围放置括号,可以告知 Angular 如何使用它。在这种情况下[nbMenuItem]意味着这可以用作 DOM 元素的属性,以及指令。