Angular 9 : Use component as directive

标签 angular angular9 angular10

最近在看angular ui框架nebular的源码,对下面的代码有疑问:

@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>();

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

@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 {
   ...
}

我的问题是,为什么nbMenuItem可以作为一个指令,它被@Component注解,为什么?我在 Angular 文档中没有找到任何关于此的信息。

最佳答案

所有组件都是指令,但并非所有指令都是组件。即组件是带有模板的指令。如 angular docs 中所定义

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

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

关于 Angular 9 : Use component as directive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62807245/

相关文章:

angular - `(keyup.backspace)` 无法捕获 'shift + backspace'

Angular:Mat Sort不适用于表格扩展

node.js - 两台相同型号的笔记本电脑之间的 Angular 编译器速度很慢

javascript - 使用Angular中的 react 形式从字段动态?

Angular 10 升级 : Why use @Directive() instead of @Component() for abstract (component) classes?

angular - Angular 2 中的 $broadcast $on

angular - Angular 10-无法使用HttpClient delete()强制错误

javascript - 单击 Angular 9 中页面的其他位置时隐藏通知

angular - ngx-mask Angular 14.2.10 的问题

angular - Angular 编译器中的错误需要 TypeScript >=3.6.4 和 <3.8.0,但找到了 3.8.2