Как вы гарантируете, что все дочерние элементы компонента angular относятся к определенному типу?

У меня есть вариант использования, который я пытаюсь реализовать в Angular — компонент заголовка, который можно разместить на странице с контейнером для кнопок с маленькими значками. Что-то вроде этого:

Заголовок с кнопками со значками

В каждый экземпляр заголовка могут быть включены разные кнопки со значками. Он должен содержать только такие кнопки, и кнопки не могут существовать, если они не находятся в заголовке. В основном это:

<my-header title="Heading Text">
  <my-header-button icon-class="save" (clicked)="doSave()"></my-header-button>
  <my-header-button icon-class="mail" (clicked)="doMail()"></my-header-button>
  <my-header-button icon-class="flag" (clicked)="doFlag()"></my-header-button>
</my-header>

родительский компонент устроен следующим образом:

import { Component, Input } from '@angular/core';

@Component({
  selector: 'my-header',
  template: `
      <header>
        <h1>{{title}}</h1>
        <div><ng-content></ng-content></div>
      </header>
    `
})

export class HeaderComponent {
  @Input() title = '';
}

Дочерний компонент реализован следующим образом:

import { Component, Input, Output, EventEmitter } from '@angular/core';
import { HeaderComponent } from './header.component';

@Component({
    selector: 'my-header-button',
    template: `
      <a (click)="onClick($event)"><i class="{{icon-class}}"</a>
    `,
})

export class HeaderButtonComponent {
    constructor(parent: HeaderComponent) { }
    @Input() public iconClass: string = '';
    @Output() public clicked: EventEmitter<any> = new EventEmitter();

    private onClick(button): void {
        this.clicked.emit(button);
    }
}

Я могу гарантировать, что my-header-button нельзя использовать вне родителя, ссылаясь на родительский тип в конструкторе (constructor(parent: HeaderComponent) { }. Мои два вопроса:

Как убедиться, что все дочерние элементы элемента my-header являются только элементами my-header-button?

Кроме того, как убедиться, что каждый my-header-button может использовать ссылку маршрутизатора ([routerLink]="['/some-link'])?


person theChrisMarsh    schedule 11.03.2018    source источник


Ответы (1)


Что касается первого вопроса, то попробовать @ViewChild может быть решением.

Попробуйте @ViewChild(HeaderButtonComponent) appButton: HeaderButtonComponent; https://alligator.io/angular/viewchild-access-component/

Для второго вопроса назначьте что-то уникальное, например, идентификатор для кнопок заголовка и укажите путь routerLink = "/some-link/{{button.id}}"

далее используйте параметры и модуль ActivatedRoute, чтобы получить идентификатор из URL-адреса. Для получения дополнительной информации ознакомьтесь с документацией https://angular.io/guide/router.

person abbaszain    schedule 11.03.2018