# 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 ```typescript @if (expression; as variableName) {
{{ variableName.property }}
} ``` ## Przykłady użycia ### Prosty alias ```typescript @if (device(); as dev) {
{{ dev.name }}
{{ dev.model }} } ``` ### Z @else ```typescript @if (getUser(); as user) {
Witaj {{ user.name }}
} @else {
Zaloguj się
} ``` ### Z @else if i aliasami ```typescript @if (getCurrentDevice(); as device) { {{ device.model }} } @else if (getDefaultDevice(); as def) { {{ def.model }} } @else { Brak urządzenia } ``` ### Zagnieżdżone wywołania funkcji ```typescript @if (getData(getValue()); as data) {
{{ data.result }}
} ``` ## 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: ```html ``` Kluczowe metody: - `parseConditionWithAlias()` - parsuje warunek i wyodrębnia alias - `transformIfBlocks()` - obsługuje zagnieżdżone nawiasy w warunkach - `buildNgContainers()` - 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 aliasem - `parseNgIfExpression()` - parsuje wyrażenie i wyodrębnia alias - `propagateContextToChildren()` - propaguje kontekst z aliasem do elementów potomnych **Działanie:** 1. Parsuje wyrażenie `*ngIf="condition; let variable"` 2. Ewaluuje `condition` 3. 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 ## 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 1. **Kontekst propagacji**: Alias jest dostępny dla wszystkich elementów potomnych poprzez `__quarcContext` 2. **Ewaluacja**: Wyrażenie jest ewaluowane tylko raz, a wynik jest przechowywany w aliasie 3. **Falsy values**: Wartości `null`, `undefined`, `false`, `0`, `''` nie renderują zawartości 4. **Zagnieżdżone nawiasy**: Parser poprawnie obsługuje zagnieżdżone wywołania funkcji w warunku