[[oktatas:web:angular|< Angular]]
====== Angular Material ======
* **Szerző:** Sallai András
* Copyright (c) 2021, Sallai András
* Szerkesztve: 2021, 2022, 2025
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== Az Angular Material =====
Az **[[https://material.angular.dev/|Angular Material]]** egy UI komponens gyűjtemény,
amit Google készít. A fejlesztéskor a **Material
Design** alapelveit használták.
A gyűjtemény gombokat, beviteli mezőket és hasonló
eszközöket tartalmaz. A használni kívánt eszközöket
TypeScript oldali importálás követően a HTML sablonban
építjük be, új HTML elemek és attribútumok formájában.
Az Angular Material nem kínál megoldást oszlop és sorszerkezetek
létrehozására. Erre a célra a [[oktatas:web:css:css_flex|CSS flexdobozai]] ajánlottak.
===== Telepítés =====
Az Angular Material-t hozzá kell adnunk a projekthez, amit célszerű az **ng** paranccsal megtenni.
Telepítés:
ng add @angular/material
Telepítéskor rákérdez, milyen témát szeretnénk választani.
? Choose a prebuilt theme name, or "custom" for a custom
theme: (Use arrow keys)
❯ Azure/Blue [Preview:
https://material.angular.io?theme=azure-blue]
Rose/Red [Preview:
https://material.angular.io?theme=rose-red]
Magenta/Violet [Preview:
https://material.angular.io?theme=magenta-violet]
Cyan/Orange [Preview:
https://material.angular.io?theme=cyan-orange]
Custom
Következő kérdés, hogy globálisan szeretnénk-e használni a tipográfiai stílusokat:
? Set up global Angular Material typography styles?
(y/N)
Majd: animációt is szeretnénk-e engedélyezni:
? Include the Angular animations module?
❯ Include and enable animations
Include, but disable animations
Do not include
==== Használat adott komponensben ====
Tegyük fel, hogy az app.component.html fájlba szeretnénk használni.
Importálni kell a .ts fájlban állomány és dekorátor szinten is.
import {MatButtonModule} from '@angular/material/button';
/* ... */
imports: [RouterOutlet,
MatButtonModule
],
===== A modul használata =====
A button elem számára egy mat-button attribútumot adunk:
Példa
Ellenőrizzük a gomb kinézetét.
Használhatunk mat-raised, mat-flat és hasonló attribútumokat is, amelyek más-más kinézetet
adnak a gombnak.
Példa
{{:oktatas:web:angular:angular_meterial_buttons.png?100|}}
Színek:
* primary: Elsődleges színséma.
* accent: Másodlagos színséma hangsúlyozáshoz.
* warn: Figyelmeztető színséma.
A képen mat-flat-button attribútummal létrehozott gombokat látunk:
{{:oktatas:web:angular:angular_material_colors.png?100|}}
A mat-raised-button esetén csak a szövegek színe lesz beállítva.
{{:oktatas:web:angular:angular_material_colors-2.png?100|}}
===== Button-ikon =====
{{:oktatas:web:angular:angular_material_button-icon.png?40|}}
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
imports: [
MatButtonModule,
MatIconModule
],
{{:oktatas:web:angular:angular_material_button-icon-2.png?80|}}
Néhány népszerű ikonok:
* Navigáció: menu, arrow_back, arrow_forward
* Műveletek: add, delete, edit, done, share
* Kommunikáció: mail, call, comment
* Fájlok: folder, insert_drive_file
* Média: play_arrow, pause, stop
* Beállítások: settings, account_circle, search
A teljes ikongyűjtemény:
* https://fonts.google.com/icons (2025)
===== Vízszintes menü gombokból =====
{{:oktatas:web:angular:angular_material_menu-from-buttons.png?300|}}
===== Input =====
Az app.component.ts fájlba felvesszük:
import {MatInputModule} from '@angular/material/input';
imports: [RouterOutlet,
MatInputModule
],
A HTML sablonban:
{{:oktatas:web:angular:angular_material_input-elements.png?200|}}
==== Szelekció és textarea ====
//...
import {
MatInputModule,
MatFormField
} from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
//...
imports: [
//...
MatInputModule,
MatFormField,
MatSelectModule
]
InputVálasszElső lehetőségMásodik lehetőségTextarea
:host {
display: flex; /* Rugalmas dobozok használata. */
flex-direction: column; /* Egymás alatt jelenjenek meg a dobozok. */
align-items: flex-start; /* Ne foglalják el a rendelkezésre álló helyet
csak saját méretük legyen, balra igazítva. */
}
A :host az aktuális Angular komponenst jelöli.
{{:oktatas:web:angular:angular_material_input-select-textarea.png?200|}}
==== Form-filed dokumentáció ====
Hivatalos dokumentáció:
* https://material.angular.dev/components/form-field/overview (2025)
===== Toggle button =====
A következő képen láthatjuk a toggle button kinézetét.
{{:oktatas:web:angular:angular_material_toggle_button.png?200|}}
A használathoz a MatSlideToggleModule-ra van szükségünk.
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
imports: [
//...
MatSlideToggleModule
],
A HTML sablonvan egy **mat-slide-toggle** elemet használhatunk.
Kapcsolás
TypeScript oldalon általában szeretnénk ennek a gombnak az állapotát kiolvasni.
Ehhez kötést kell létrehozni egy változóhoz.
TypeScriptbe kötés példa:
import { FormsModule } from '@angular/forms';
imports: [
FormsModule
],
//...
export class AppComponent {
isToggled = true;
}
Kapcsolás
===== Párbeszédablak =====
import { ChangeDetectionStrategy,Component, inject } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import {
MatDialog,
MatDialogActions,
MatDialogClose,
MatDialogContent,
MatDialogRef,
MatDialogTitle
} from '@angular/material/dialog';
@Component({
selector: 'app-root',
standalone: true,
imports: [
MatButtonModule
],
templateUrl: './app.component.html',
styleUrl: './app.component.css'
})
export class AppComponent {
readonly dialog = inject(MatDialog);
openDialog(
enterAnimationDuration: string,
exitAnimationDuration: string): void {
const dialogRef = this.dialog.open(Dialog, {
width: '250px',
enterAnimationDuration,
exitAnimationDuration,
});
dialogRef.afterClosed().subscribe(result => {
console.log('Eredmény:', result);
if(result === 'Igen') {
console.log('Törlés...');
}
})
}
}
@Component({
selector: 'dialog',
templateUrl: 'dialog.html',
standalone: true,
imports: [MatButtonModule, MatDialogActions, MatDialogClose, MatDialogTitle, MatDialogContent],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class Dialog {
readonly dialogRef = inject(MatDialogRef
button {
margin-right: 8px;
}
Érték törlése
Törlöd ezt az értékekt?
Hivatalos dokumentáció:
* https://material.angular.dev/components/dialog/overview (2025)
===== Dátum =====
//...
import {
MAT_DATE_LOCALE,
provideNativeDateAdapter
} from '@angular/material/core';
export const appConfig: ApplicationConfig = {
providers: [
provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(routes),
provideAnimationsAsync(),
provideNativeDateAdapter(),
{ provide: MAT_DATE_LOCALE, useValue: 'hu' },
]
};
//...
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatFormFieldModule } from '@angular/material/form-field';
//...
imports: [
MatDatepickerModule,
MatFormFieldModule
],
//...
TartományYYYY-MM-DD - YYYY-MM-DD
Hivatalos dokumentáció:
* https://material.angular.dev/components/datepicker/overview (2025)
===== Téma cseréje =====
Az Angular Material telepítéskor rákérdez a témára. Ez a téma később is megváltoztatható az
angular.json fájlban. Keressük meg a styles kulcsot.
"styles": [
"@angular/material/prebuilt-themes/cyan-orange.css",
"src/styles.css"
],
A node_modules könyvtárban keressük meg a betölthető témákat:
node_modules/@angular/material/prebuilt-themes/
Példa:
* azure-blue.css
Állítsuk be a kívánt témát.
===== Flex dobozok =====
Mivel az Angular Material nem rendelkezik sor és oszlop elrendezési lehetőséggel,
flex dobozok használatát ajánlják CSS-ből beállítva.
Lássunk erre egy egyszerű példát:
.container {
margin-inline: 5%;
padding-inline: 1.5rem;
}
.row {
display: flex;
margin-inline: -12px;
}
.col {
padding-inline: 12px;
width: 100%;
}
aaa
bbb
ccc
ddd
===== Link =====
* https://material.angular.io/guide/getting-started