Вы можете использовать MatMenu, но вам нужно сделать несколько вещей, чтобы он заработал.
Во-первых, не использовать mat-menu-item
.Это вынуждает стилизовать элемент так, чтобы он имел фиксированную высоту, равную ожидаемой для элемента меню.
Второй - предотвращение распространения взаимодействия обратно в меню, приводящее к его закрытию при попытке использования.форма.Используйте функцию Event.stopPropagation () на крайнем родительском элементе вашей формы внутри меню.Вы также можете запретить закрытие меню, когда вы нажимаете за пределами него на фоне (и добавляете свою собственную кнопку закрытия или отмены).Это будет выглядеть примерно так:
<mat-menu class="menu-form-wrapper" [hasBackdrop]="false">
<div (click)="$event.stopPropagation()" (keydown)="$event.stopPropagation()">
<form class="menu-form">
...
Вам также нужно позаботиться о стайлинге.Контейнер формы должен занимать все меню, чтобы пользователь не мог щелкнуть за его пределами, но все еще в меню, вызывая его закрытие.И вам нужно переопределить заполнение по умолчанию, которое MatMenu добавляет в свой контейнер mat-menu-content
.Этот стиль должен быть в вашей глобальной таблице стилей, а не в стиле компонента, и именно здесь вы добавите макет вашей формы:
// override mat-menu-content padding
.menu-form-wrapper .mat-menu-content:not(:empty) {
padding: 0;
}
// layout for the form
.menu-form-wrapper .menu-form {
display: flex;
flex-direction: column;
padding: 24px;
}
Здесь он находится в StackBlitz .