Dyrektywa @if – warunkowe wyświetlanie
@if pozwala decydować co ma się pojawić na stronie w zależności od warunków –
dokładnie jak instrukcja if w TypeScript, tyle że w szablonie HTML.
Nauczysz się też jak wyglądał stary sposób z *ngIf.
Czym jest @if?
W TypeScript używasz if żeby wykonać kod tylko gdy spełniony
jest jakiś warunek. W szablonie Angular działa dokładnie ta sama idea –
@if wyświetla fragment HTML tylko wtedy, gdy warunek jest prawdziwy.
TypeScript – if w logice
// Wykonuje kod gdy warunek prawdziwy if (wiek >= 18) { pokazTresc(); } else { pokazBlad(); }
Angular – @if w szablonie
<!-- Wyświetla HTML gdy warunek prawdziwy --> @if (wiek >= 18) { <p>Witaj, pełnoletni użytkowniku!</p> } @else { <p>Musisz mieć 18 lat.</p> }
Kluczowa różnica: if w TypeScript decyduje co zrobić,
a @if w szablonie decyduje co wyświetlić.
Gdy warunek nie jest spełniony, Angular w ogóle nie tworzy elementu w HTML –
znika on kompletnie ze strony.
To ważna różnica w stosunku do CSS display: none.
display: none ukrywa element, ale wciąż istnieje on w HTML.
@if gdy ma wartość false całkowicie
usuwa element z DOM – jakby go nigdy nie było.
Ma to znaczenie dla wydajności przy dużych listach i formularzach.
Podstawowa składnia @if
Składnia @if jest prosta: słowo kluczowe, warunek w nawiasach
okrągłych i blok HTML w klamrach. Warunek to dowolne wyrażenie TypeScript
dające wartość true lub false.
export class AppComponent { czyZalogowany = true; imie = 'Piotr'; wiek = 20; czyAdmin = false; }
<!-- Warunek: zmienna boolean --> @if (czyZalogowany) { <p class="alert alert-success">Jesteś zalogowany jako {{ imie }}.</p> } <!-- Warunek: porównanie liczb --> @if (wiek >= 18) { <p>Masz dostęp do pełnej wersji.</p> } <!-- Warunek: negacja --> @if (!czyAdmin) { <p class="text-muted">Nie masz uprawnień administratora.</p> }
Operatory porównania: ==, !=, ===,
>, <, >=, <=.
Operatory logiczne: && (i), || (lub),
! (nie). Wywołania metod zwracające boolean.
Każde wyrażenie dające true lub false.
@else – gałąź alternatywna
Gdy warunek nie jest spełniony, możemy wyświetlić coś innego – za pomocą
bloku @else. Działa identycznie jak else
w TypeScript.
export class AppComponent { czyZalogowany = false; imie = 'Anna'; przelaczLogin(): void { this.czyZalogowany = !this.czyZalogowany; } }
@if (czyZalogowany) { <!-- Ten blok widoczny gdy czyZalogowany = true --> <div class="alert alert-success"> <h4>Witaj, {{ imie }}! 👋</h4> <p>Jesteś zalogowany.</p> <button class="btn btn-outline-danger" (click)="przelaczLogin()"> Wyloguj </button> </div> } @else { <!-- Ten blok widoczny gdy czyZalogowany = false --> <div class="alert alert-warning"> <h4>Nie jesteś zalogowany.</h4> <p>Zaloguj się, aby zobaczyć zawartość.</p> <button class="btn btn-primary" (click)="przelaczLogin()"> Zaloguj </button> </div> }
Kliknięcie przycisku wywołuje przelaczLogin(), która odwraca
wartość czyZalogowany. Angular automatycznie reaguje na tę zmianę
i zamienia wyświetlany blok HTML – bez przeładowania strony.
Między klamrami { } możesz wstawić dowolną liczbę
elementów HTML. Nie musisz owijać ich w dodatkowy <div>
– Angular renderuje wszystkie elementy z bloku bez żadnego opakowania.
@else if – wiele warunków
Gdy mamy więcej niż dwie możliwości, łączymy @else if
– dokładnie tak samo jak w TypeScript.
export class AppComponent { punkty: number = 72; }
<div class="card p-3"> <h4>Wynik testu: {{ punkty }} / 100</h4> @if (punkty >= 90) { <span class="badge bg-success fs-6">Celujący – brawo!</span> } @else if (punkty >= 75) { <span class="badge bg-primary fs-6">Bardzo dobry</span> } @else if (punkty >= 50) { <span class="badge bg-warning fs-6">Dostateczny</span> } @else { <span class="badge bg-danger fs-6">Niedostateczny – popraw!</span> } </div> <!-- Dla punkty = 72 wyświetli się: "Dostateczny" -->
Tak jak w TypeScript, Angular sprawdza warunki od góry i zatrzymuje się
przy pierwszym, który jest true. Dlatego kolejność
@else if ma znaczenie – bardziej szczegółowe warunki
(np. >= 90) piszemy wyżej niż ogólne (>= 50).
Warunki złożone – && i ||
W warunku @if możesz łączyć wiele warunków operatorami
logicznymi – tak samo jak w TypeScript.
export class AppComponent { czyZalogowany = true; czyAdmin = false; wiek = 17; imie = 'Kacper'; }
<!-- && – oba warunki muszą być prawdziwe --> @if (czyZalogowany && czyAdmin) { <p>Panel administracyjny</p> } <!-- || – wystarczy jeden prawdziwy warunek --> @if (czyZalogowany || wiek >= 18) { <p>Masz dostęp do treści.</p> } <!-- Warunek na string – sprawdzamy czy nie jest pusty --> @if (imie.length > 0) { <p>Cześć, {{ imie }}!</p> } @else { <p>Podaj swoje imię.</p> } <!-- Skrócony warunek na string – truthy/falsy --> @if (imie) { <p>Cześć, {{ imie }}!</p> }
W JavaScript i TypeScript nie tylko true/false
są traktowane jako warunki. Puste wartości są automatycznie traktowane
jako false – nazywamy je falsy:
false, 0, '' (pusty string),
null, undefined, NaN.
Wszystko inne jest truthy (traktowane jako true).
Dlatego @if (imie) działa – pusty string jest falsy,
niepusty jest truthy.
Stary sposób – *ngIf
Przed Angular 17 nie istniała składnia @if. Warunkowe wyświetlanie
realizowało się przez dyrektywę strukturalną *ngIf.
Znaj ją – spotkasz ją w starszym kodzie i na Stack Overflow.
🕰️ Stary sposób – *ngIf
<!-- Wymagało importu NgIf w komponencie --> <p *ngIf="czyZalogowany"> Witaj! </p> <!-- @else było bardziej skomplikowane --> <p *ngIf="czyZalogowany; else niezalogowany"> Witaj! </p> <ng-template #niezalogowany> <p>Zaloguj się.</p> </ng-template>
✅ Nowy sposób – @if (Angular 21)
<!-- Nie wymaga żadnych importów --> @if (czyZalogowany) { <p>Witaj!</p> } @else { <p>Zaloguj się.</p> }
| *ngIf (stary) | @if (nowy) | |
|---|---|---|
| Dostępny od | Angular 2 | Angular 17+ |
| Import wymagany? | Tak – NgIf lub CommonModule |
Nie – działa od razu |
| Czytelność | Średnia – atrybut w znaczniku | Wysoka – osobny blok jak w TS |
| Gałąź @else | Przez ng-template – nieczytelne |
Naturalnie za blokiem } |
| Zalecane? | ❌ W nowych projektach – nie | ✅ Tak – to obecny standard |
Oba działają, ale mieszanie ich w jednym projekcie utrudnia czytanie kodu.
Wybierz jeden styl i trzymaj się go. W nowych projektach Angular 21
używamy wyłącznie @if.
Częste błędy
❌ Błąd 1 – Brak klamr
❌ Źle – brak { }
<!-- To nie zadziała – brak klamr --> @if (czyZalogowany) <p>Witaj!</p>
✅ Dobrze – klamry obowiązkowe
@if (czyZalogowany) { <p>Witaj!</p> }
❌ Błąd 2 – @else bez zamknięcia poprzedniego bloku
❌ Źle
@if (warunek) { <p>Tak</p> // brak zamknięcia } ! @else { <p>Nie</p> }
✅ Dobrze – } @else bezpośrednio
@if (warunek) { <p>Tak</p> } @else { <p>Nie</p> }
❌ Błąd 3 – Przypisanie zamiast porównania
❌ Źle – jedno = to przypisanie
<!-- = to przypisanie, nie porównanie! --> @if (wiek = 18) { ... }
✅ Dobrze – == lub ===
<!-- === porównuje wartość i typ --> @if (wiek === 18) { ... } <!-- >= dla zakresu --> @if (wiek >= 18) { ... }
Zadanie – panel statusu ucznia
Stwórz aplikację wyświetlającą panel statusu ucznia. Zdefiniuj w klasie
zmienne i użyj @if, @else if i @else
do wyświetlania różnych komunikatów.
Zdefiniuj w klasie:
imie– imię ucznia (string)srednia– średnia ocen (number, np.3.8)czyObecny– czy uczeń jest obecny (boolean)liczbaNieobecnosci– liczba nieobecności (number)
W szablonie wyświetl:
-
Komunikat obecności: jeśli
czyObecny– zielony alert „Uczeń obecny”, w przeciwnym razie – czerwony alert „Uczeń nieobecny” - Ocenę słowną ze średniej: celujący (≥5.0), bardzo dobry (≥4.5), dobry (≥3.5), dostateczny (≥2.75), niedostateczny (pozostałe) – każda w odpowiednim kolorze Bootstrap badge
-
Ostrzeżenie jeśli liczba nieobecności przekracza 10 i uczeń jest nieobecny
(warunek złożony z
&&)
Zmień kilka razy wartości zmiennych w klasie i sprawdź czy szablon reaguje poprawnie.
W następnym materiale poznamy @for – pętlę szablonową, która pozwala wyświetlić listę elementów z tablicy bez ręcznego powielania kodu HTML.