Как они удалили элемент-обертку компонента Angular в Clarity

Я заметил, что кнопка дизайн-системы Clarity не содержит элемента-обертки в DOM. Мне это нравится по разным причинам (ясность – без каламбура, доступность).

Я искал решения, позволяющие сделать такую ​​вещь. Некоторые решения рискуют повлиять на обнаружение изменений Angulars и другие механизмы.

Решение, выбранное Clarity, кажется очень чистым. Но я не могу заставить его работать: лучший результат, который мне удалось, - это по-прежнему получить элемент-оболочку и содержимое, помещенное как родственный элемент в DOM.

Вот код Clarity для кнопки: https://github.com/vmware-clarity/ng-clarity/blob/main/projects/angular/src/button/button-group/button.ts И вот как это отображается:

Насколько я понимаю, как они это сделали:

  • поместить содержимое компонента в ng-шаблон со ссылкой
  • связать ссылку с viewchild
@Component({
  selector: 'clr-button',
  template: `
    <ng-template #buttonProjectedRef>
      <button
export class ClrButton implements LoadingListener {
  @Output('click') _click = new EventEmitter<boolean>(false);

  @ViewChild('buttonProjectedRef', { static: true }) templateRef: TemplateRef<ClrButton>;

Как ни странно, я не вижу, где используется имя свойства viewchild («templateRef»).

Вероятно, они использовали рендерер для замены имени тега хоста, и если да, то это не лучшая идея. Вы можете использовать компонент в качестве селектора атрибутов на кнопке, как это делает Angular Material, и это лучшая идея, потому что при замене тега хоста элемент не уничтожается автоматически Angular, и вам придется позаботиться об этом самостоятельно. Также структурные директивы, такие как *ngIf, могут нарушаться.

Silvermind 01.05.2024 10:14
Тестирование функциональных 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
1
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На самом деле у компонента кнопки есть собственный селектор clr-button, но он не будет работать сам по себе, для него требуется родительский компонент clr-button-group.

В демо-версиях они это используют вот так

  <clr-button-group>
    <clr-button>1</clr-button>
    <clr-button>2</clr-button>
    <clr-button>3</clr-button>
    <clr-button [clrInMenu] = "true">4</clr-button>
    <clr-button [clrInMenu] = "true">5</clr-button>
    <clr-button [clrInMenu] = "true">6</clr-button>
  </clr-button-group>

Итак, кнопки существуют внутри Content Children

Таким образом, группы кнопок сначала принимают дочерний контент всех кнопок.

Группа кнопок T

export class ClrButtonGroup implements AfterContentInit, AfterViewInit {
  @Input('clrToggleButtonAriaLabel') clrToggleButtonAriaLabel: string = this.commonStrings.keys.rowActions;

  @ViewChild('menuToggle') menuToggle: ElementRef<HTMLElement>;
  @ViewChild('menu') menu: ElementRef<HTMLElement>;

  @ContentChildren(ClrButton) buttons: QueryList<ClrButton>; // this line here!

После этой обработки происходит нажатие кнопок на menuButtons, затем, наконец, над кнопками выполняется цикл и визуализируется с использованием ng-template.

HTML группы кнопок

<ng-template *ngFor = "let menuButton of menuButtons" [ngTemplateOutlet] = "menuButton.templateRef"></ng-template>

Но ведь им все же удается отображать только тег <button> для кнопок, которые не входят в группу? Может быть, я связался с неправильным файлом ts в Clarity? Я думал, что это «автономная» кнопка.

Koert van Kleef 01.05.2024 11:06

@KoertvanKleef, пожалуйста, поделитесь примером, где это происходит, на github.

Naren Murali 01.05.2024 11:16

В их историях из сборника рассказов есть примеры, где кнопка используется в качестве кнопки ClrButton: github.com/vmware-clarity/ng-clarity/blob/main/.storybook/… . В этих историях селектор выглядит просто как тег button. В button-group/button.ts ( github.com/vmware-clarity/ng-clarity/blob/main/projects/ang‌​ular/…) указан селектор тегов clr-button, но они тоже просто отображаются <button> в DOM.

Koert van Kleef 01.05.2024 11:29

@KoertvanKleef Они делают то же самое: определяют кнопку, добавляют ссылку #buttonRef, затем используют ее для рендеринга внутри ng-template они идут долгим путем: если им не нужен селектор, им следует просто определить компонент с помощью селектора класса .cls-button или селектор атрибутов [clsButton] это более простой способ добиться того, чего вы хотите!

Naren Murali 01.05.2024 11:36

Я не совсем уверен, что понимаю. Если компонент button-group/button.ts (с селектором clr-button) используется в историях кнопок, то как angular узнает, что эти <button> на самом деле являются clr-button? Поскольку button не соответствует селектору кнопки clr.

Koert van Kleef 01.05.2024 11:45

@KoertvanKleef Итак, это не та кнопка, о которой вы говорите, это просто обычные кнопки, они clr-button не могут существовать без собственного селектора <clr-button/>

Naren Murali 01.05.2024 11:46

Я думаю, что понял. Таким образом, кнопки, являющиеся частью группы кнопок, могут отображаться как button, поскольку группа кнопок отображает их содержимое (таким образом, опуская оболочку), а отдельные кнопки представляют собой просто кнопки HTML с CSS?

Koert van Kleef 01.05.2024 14:01

@KoertvanKleef Да, именно, попробуйте мое предложение для разных селекторов компонентов, они тоже не создают ненужных элементов!

Naren Murali 01.05.2024 14:16

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