Angular 6: программно показать / скрыть компонент с помощью @ContentChildren и @HostBinding?

Я хочу создать компонент вкладки. Это должен быть конечный результат:

<app-tab-container>
        <app-tab-item caption = "A">..contentA..</app-tab-item>
        <app-tab-item caption = "B">..contentB..</app-tab-item>
        <app-tab-item caption = "C">..contentC..</app-tab-item>
</app-tab-container>

TabItemComponent имеет оформленное поле @HostBinding ('hidden'):

export class TabItemComponent {
    @HostBinding('hidden') isHidden = false;
    @Input() caption: string;
}

В TabContainerComponent я использую @ContentChildren для перебора элементов табуляции:

export class TabContainerComponent {
    @ContentChildren(TabItemComponent) items: QueryList<TabItemComponent>;
    tabItems: string[] = [];

    ngAfterContentInit() {
        this.items.forEach((item, idx) => {item.isHidden = true; this.tabItems.push(item.caption));
    }
}

Наконец, шаблон TabContainerComponent выглядит следующим образом:

<div class = "tab-title"
     *ngFor = "let caption of tabItems">{{caption}}</div>
<ng-content></ng-content>

Конечная цель - переключить видимость элемента вкладки с помощью события щелчка.

Когда я запускаю код, заголовки вкладок отображаются правильно, но само содержимое (app-tab-item caption = от «A» до «C») все еще отображается, настройка isHidden не переключает видимость.

Обратите внимание, что я не знаю количество компонентов «app-tab-item», так как я могу разместить «app-tab-container» в другом месте с другим содержимым.

Как я могу программно переключать видимость компонентов <app-tab-item> с помощью @ContentChildren?

When I run the code tab titles display correctly but the content itself (app-tab-item caption = "A" to "C") is still visible Можете ли вы воспроизвести это с помощью stackblitz?
yurzui 22.05.2018 06:54

Извините, не в этот раз, потому что мне пришлось много "тупить" код. Но все же я нашел решение проблемы. @HostBinding ('class.hidden') @Input () hidden = false;

Wolf359 22.05.2018 07:22
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
7
2
4 663
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение. Вместо того, чтобы пытаться установить атрибут [hidden], я теперь установил класс css '.hidden'. Работает как положено:

export class TabItemComponent {
    @HostBinding('hidden') isHidden = false;
    @Input() caption: string;
}

Я использовал этот код + класс css:

export class TabItemComponent {
    @HostBinding('class.hidden') @Input() hidden = false;
    @Input() caption: string;
}

.hidden {
    display: none;
}

Другие вопросы по теме