3.4 KiB
Obsługa aliasów w @if directive
Opis funkcjonalności
Framework Quarc został rozszerzony o obsługę składni @if (condition; as variable), która pozwala przypisać wynik wyrażenia warunkowego do zmiennej lokalnej i używać jej w template bez wielokrotnego wywoływania metody/signala.
Składnia
@if (expression; as variableName) {
<div>{{ variableName.property }}</div>
}
Przykłady użycia
Prosty alias
@if (device(); as dev) {
<div>{{ dev.name }}</div>
<span>{{ dev.model }}</span>
}
Z @else
@if (getUser(); as user) {
<div>Witaj {{ user.name }}</div>
} @else {
<div>Zaloguj się</div>
}
Z @else if i aliasami
@if (getCurrentDevice(); as device) {
<span>{{ device.model }}</span>
} @else if (getDefaultDevice(); as def) {
<span>{{ def.model }}</span>
} @else {
<span>Brak urządzenia</span>
}
Zagnieżdżone wywołania funkcji
@if (getData(getValue()); as data) {
<div>{{ data.result }}</div>
}
Implementacja
Compile-time (Template Processor)
Plik: /web/quarc/cli/helpers/control-flow-transformer.ts
Kompilator template parsuje składnię @if (condition; as variable) i generuje:
<ng-container *ngIf="condition; let variable">
Kluczowe metody:
parseConditionWithAlias()- parsuje warunek i wyodrębnia aliastransformIfBlocks()- obsługuje zagnieżdżone nawiasy w warunkachbuildNgContainers()- generuje odpowiedni kod HTML z aliasem
Runtime (Template Renderer)
Plik: /web/quarc/core/module/template-renderer.ts
Runtime obsługuje składnię *ngIf="condition; let variable":
Kluczowe metody:
processNgIfDirective()- przetwarza dyrektywę *ngIf z opcjonalnym aliasemparseNgIfExpression()- parsuje wyrażenie i wyodrębnia aliaspropagateContextToChildren()- propaguje kontekst z aliasem do elementów potomnych
Działanie:
- Parsuje wyrażenie
*ngIf="condition; let variable" - Ewaluuje
condition - Jeśli wynik jest truthy:
- Tworzy nowy kontekst z aliasem:
{ [variable]: value } - Przypisuje kontekst do elementów DOM poprzez
__quarcContext - Renderuje zawartość z dostępem do aliasu
- Tworzy nowy kontekst z aliasem:
Testy
Compile-time testy
Plik: /web/quarc/tests/unit/test-functionality.ts
- Test 20: Prosty alias
- Test 21: @if @else if z aliasami
- Test 22: Zagnieżdżone nawiasy w warunku
- Test 23: Białe znaki w składni
- Test 24: Wiele aliasów w @else if
Runtime testy
Plik: /web/quarc/tests/unit/test-ngif-alias.ts
Testy runtime wymagają środowiska przeglądarki (DOM API) i nie są uruchamiane automatycznie w Node.js.
Wyniki testów
Wszystkie testy compile-time przeszły pomyślnie:
- ✅ 24/24 testów funkcjonalnych
- ✅ 100% pokrycie dla składni z aliasem
Kompatybilność
Składnia jest w pełni kompatybilna wstecz:
@if (condition)- działa jak dotychczas@if (condition; as variable)- nowa funkcjonalność
Uwagi techniczne
- Kontekst propagacji: Alias jest dostępny dla wszystkich elementów potomnych poprzez
__quarcContext - Ewaluacja: Wyrażenie jest ewaluowane tylko raz, a wynik jest przechowywany w aliasie
- Falsy values: Wartości
null,undefined,false,0,''nie renderują zawartości - Zagnieżdżone nawiasy: Parser poprawnie obsługuje zagnieżdżone wywołania funkcji w warunku