Angular 9: Использовать компонент как директиву - PullRequest
1 голос
/ 09 июля 2020

Недавно я читал исходный код nebular, angular ui framework, у меня есть вопросы по следующему коду:

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

Ответы [ 2 ]

4 голосов
/ 09 июля 2020

Все компоненты являются директивами, но не все директивы являются компонентами. т.е. компонент - это директива с шаблоном. как указано в angular docs

, основная причина, по которой вы можете использовать nbMenuItem в качестве атрибута элемента DOM, связана с селектором для NbMenuItemComponent.

, заключив в скобки селектор, который сообщает Angular о том, как его можно использовать. в данном случае [nbMenuItem] означает, что его можно использовать как атрибут элемента DOM и, как таковой, как директиву.

0 голосов
/ 09 июля 2020

В angular 9 селектор атрибутов наследуется от декоратора Директивы. См. Angular Компонент

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...