#angular #checkbox #menu #angular-material #menu-items
#angular #флажок #меню #angular-material #пункты меню
Вопрос:
Вы не можете поместить <mat-checkbox>
в <mat-menu>
нормально. Если это так, то темные темы не применяются к текстовой части вашего <mat-checkbox>
текста (см. Изображение в конце).
О <mat-label>
s существует аналогичная проблема. Но решение простое:
- Используя
<label mat-menu-item>
вместо<mat-label>
.
Аналогично о button
s.
Но я не смог найти аналогичное решение для <mat-checkbox>
es! Это все состояния, которые я тестировал:
<mat-menu #menu="matMenu">
<mat-label>Bad label</mat-label>
<label mat-menu-item>OK label</label>
<mat-checkbox>Problem here</mat-checkbox>
<!-- ERROR:
<mat-checkbox mat-menu-item>
Template parse errors:
More than one component matched on this element.
</mat-checkbox>
-->
<br><mat-checkbox></mat-checkbox>
<label mat-menu-item style="display:inline">Not good workaround</label>
</mat-menu>
И результат:
Ответ №1:
Кажется, есть способ назначить menuitemcheckbox
для role
ввода, в mat-menu-item
директиве … к сожалению, я не совсем понимаю, как это должно работать…
<!-- https://github.com/angular/material2/commit/3f1588f562a4abd85d6add87a4f6ed969ba56898#diff-4cc67949abfd84b09e8b7178ac357febR2134 -->
<button mat-menu-item role="menuitemcheckbox" aria-checked="true">Checked</button>
<button mat-menu-item role="menuitemcheckbox" aria-checked="false">Not </button>
С учетом сказанного, назначение mat-menu-item
класса, а не директивы, может быть жизнеспособным обходным путем.
<mat-checkbox class="mat-menu-item">Problem here</mat-checkbox>
Stackblitz
https://stackblitz.com/edit/angular-j4ftuc-5s5k3t?embed=1amp;file=app/menu-overview-example.html
Комментарии:
1. Согласно github.com/angular/components/pull/14165 , роль управляет только aria-ролью в пункте меню. Добавление первоклассных элементов mat-item-checkbox, возможно, появится в будущем minor
Ответ №2:
Начиная с Angular Material 11, class="mat-menu-item"
обходное решение, введенное Marshal, похоже, не работает. Вы можете исправить это, применив mat-menu-item
директиву к div
упаковке вашего mat-checkbox
.
<div mat-menu-item>
<mat-checkbox>Problem here</mat-checkbox>
</div>
Имейте в виду, что флажок теперь срабатывает только при нажатии точно на флажок, а не при нажатии на любую другую точку пункта меню. Это вызывает только анимацию щелчка. Чтобы обойти это, вы можете зарегистрировать (click)="..."
прослушиватель в обтекающем div.
Комментарии:
1. Вы правы, чтобы добавить поведение при нажатии, вы можете зарегистрировать (click) следующим образом: (click)=»$event.preventDefault(); Проверка фильтра. _inputElement.nativeElement.click()»
2. должно быть
<div mat-menu-item> <mat-checkbox>Problem here</mat-checkbox> </div>
Ответ №3:
Уточнение ответа Aki:
<div mat-menu-item (click)="$event.stopPropagation(); cb.toggle()" (keydown.enter)="$event.stopPropagation(); cb.toggle()">
<mat-checkbox class="mat-menu__checkbox" (click)="$event.stopPropagation()" #cb>Problem No Longer Here</mat-checkbox>
</div>
Требуется div-оболочка (keydown.enter)
, чтобы элементы управления клавиатурой для mat-меню все еще работали правильно. Мы также регистрируем событие щелчка, поэтому, если пользователь нажимает на правый или левый края пункта меню, он переключает флажок. $event.stopPropagation()
предназначен для предотвращения закрытия меню, пока пользователь взаимодействует с флажками.
Затем добавьте следующее в свою таблицу стилей:
.mat-menu__checkbox {
height: 100%;
amp;::ng-deep .mat-checkbox-layout {
height: 100%;
amp;::ng-deep .mat-checkbox-label {
margin: auto;
vertical-align: middle;
position: relative;
}
}
}
Этот стиль сделает надпись вашего mat-флажка на всю высоту пункта меню и сохранит ее вертикальный центр. Это позволяет щелкнуть флажок в любом месте, и он сработает.