Проблема в том, что меню отображается в оверлейном контейнере, прикрепленном к родительскому документу, а не самой кнопке ... Помня об этом, вам нужно подумать о том, как получить ссылку на этот mat-menu-panel
и добавьте к нему класс, чтобы сделать его уникальным в открытом меню.
Например, вы можете сделать что-то вроде следующего, чтобы выполнить это.
Создайте метод компонента, который получит templateRef
в качестве аргумента. Он получит mat-menu-panel
с использованием Renderer2
и добавит к нему класс styled
styleMenu(el) {
const menuPanel = this.ren.parentNode(this.ren.parentNode(el.items.first['_elementRef'].nativeElement));
this.ren.addClass(menuPanel, 'styled')
}
Затем, по вашему мнению, используйте генератор событий (menuOpened)
, чтобы вызвать метод styleMenu
при открытии меню, и передайте #styledMenu
templateRef в качестве аргумента.
<button mat-button [matMenuTriggerFor]="styledMenu" (menuOpened)="styleMenu(styledMenu)">styled</button>
<mat-menu #styledMenu="matMenu">
Тогда ваш CSS будет выглядеть так
::ng-deep .mat-menu-panel.styled
{
position: fixed !important;
right : 2%;
}
Это один из подходов, вы также можете свернуть все это в directive
и затем просто применить директиву selector
там, где вам это нужно.
Stackblitz
https://stackblitz.com/edit/angular-5nixtl?embed=1&file=app/menu-overview-example.ts