Pytania rekrutacyjne Angular

60 pytań — 20 odpowiedzi dostępnych od razu

Przygotowujesz się do rozmowy rekrutacyjnej z Angular? Ten darmowy podgląd pozwala sprawdzić sposób pracy z pytaniami i odpowiedziami przed sięgnięciem po pełny materiał. Zawiera przykładowe pytania z puli 60 zagadnień dla osób pracujących z aplikacjami Angular.

Zakres obejmuje podstawy frameworka, komponenty, dyrektywy, pipe'y oraz change detection. To dobry punkt wyjścia do powtórki pojęć, które często pojawiają się podczas rozmów na stanowiska frontendowe.

Darmowy start

Pierwsze 20 odpowiedzi są dostępne od razu

Przeglądaj pełną listę 60 pytań. Pełne odpowiedzi, przykłady kodu i materiały do nauki odblokujesz w panelu.

Odblokuj 40 odpowiedzi

Podstawowe zagadnienia

Czym jest Angular?

Angular to oparty na TypeScript otwarty framework do pisania aplikacji webowych stworzony i utrzymywany przez Google.

Główny nacisk jest położony na szybkość tworzenia aplikacji i ułatwienie wiązania komponentów z modelem danych.

Do najważniejszych zalet korzystania z Angulara należą:

  • Mechanizm wstrzykiwania zależności (ang. dependency injection) ułatwiający konfigurowanie aplikacji,
  • Dynamiczny mechanizm szablonów (ang. templates),
  • Dwukierunkowy przepływ danych w aplikacji,
  • Dostęp do wielu funkcjonalności bez konieczności konfiguracji i korzystania z dodatkowych bibliotek, np.

routing, zarządzanie stanem, RxJS, HTTP,

  • Szeroka dostępność narzędzi programistycznych i zewnętrznych bibliotek

Jakie są cechy Angulara?

Do najważniejszych cech Angulara należy:

  • Architektura oparta na komponentach,
  • Dwukierunkowy przepływ danych w aplikacji,
  • Generowanie kodu za pomocą Angular CLI,
  • Tworzenie animacji bez pisania złożonego kodu CSS,
  • Prosta konfiguracja routingu ułatwiająca podział kodu oraz lazy loading, dzięki czemu tylko część aplikacji jest renderowana na początku,
  • Mechanizm wstrzykiwania zależności (ang. dependency injection),
  • Wsparcie dla wielu platform i środowisk programistycznych, np. aplikacje webowe, PWA oraz natywne,
  • Prosta składnia szablonów (ang. templates) do tworzenia dynamicznych widoków,
  • Prosta walidacja danych

Co odróżnia Angular od AngularJS?

AngularJS Angular
Wykorzystanie JavaScript Wykorzystanie TypeScript Architektura MVC Architektura oparta na komponentach
Brak wsparcia dla aplikacji mobilnych Wsparcie dla aplikacji mobilnych
Brak wsparcia dla SSR (ang. server-side rendering) Wsparcie dla SSR przez Angular Universal
Wykorzystanie ng-model oraz ng-bind do wiązania danych Wykorzystanie ngModel oraz [] i () do wiązania danych
Wykorzystanie kontrolerów Wykorzystanie komponentów

Jakie są elementy składowe Angulara?

Do najważniejszych składowych Angulara należą:

  • Komponenty (ang. components)
  • Dyrektywy (ang. directives)
  • Serwisy (ang. services)
  • Moduły (ang. modules)
  • Szablony (ang. templates)
  • Metadane (ang. metadata)
  • Mechanizm Routingu
  • Mechanizm wiązania danych (ang. data binding)
  • Mechanizm wstrzykiwania zależności (ang. dependency injection)

Jak współpracują ze sobą różne składowe Angulara?

  • Komponenty są zgrupowane w moduły pod względem funkcjonalności a każda aplikacja to zbiór modułów,
  • Komponenty definiują widoki, które Angular aktualizuje w oparciu o logikę biznesową oraz stan aplikacji,
  • Komponenty używają serwisów, które zawierają logikę biznesową, nie związaną bezpośrednio z widokami,
  • Moduły, komponenty, dyrektywy i serwisy to klasy TypeScript, które używają dekoratorów z metadanymi,
  • Metadane komponentu wiążą go z szablonem HTML, który oprócz standardowych elementów zawiera również dyrektywy Angulara oraz wiązania właściwości, które pozwalają na aktualizację widoku na podstawie statu aplikacji,
  • Metadane serwisu dostarczają informacji o tym, jak serwis będzie dostępny dla mechanizmu wstrzykiwania zależności
  • Aplikacja definiuje wiele widoków, które są zorganizowane hierarchicznie. Angular dostarcza Router, za pomocą którego można nawigować pomiędzy ekranami.

Komponenty

Czym jest komponent?

Komponent (ang. component) to klasa oznaczona dekoratorem @Component opisująca fragment UI aplikacji. Składa się z dyrektywy powiązanej z szablonem. W przeciwieństwie do innych dyrektyw, tylko jeden komponent może być przypisany do pojedynczego elementu DOM.

Aplikacja ma przynajmniej jeden root component, który łączy drzewo komponentów z modelem DOM.

Każdy komponent musi być częścią NgModule, aby mógł zostać zrenderowany. W tym celu należy go dodać do listy declarations w metadanych NgModule.

Zachowanie komponentów można kontrolować za pomocą ich cyklu życia, który rozpoczyna się, gdy Angular inicjalizuje komponent i zaczyna go renderować razem ze wszystkimi komponentami zależnymi.

W jaki sposób dwa komponenty mogą się komunikować?

W Angularze dwa komponenty mogą się komunikować na kilka sposobów:

  • Za pomocą dekoratora @Input() komponent rodzica może przekazywać dane do komponentu dziecka,
  • Za pomocą dekoratora @Output() oraz EventEmittera komponent dziecka może przekazywać dane do komponentu rodzica,
  • Za pomocą dekoratora @ViewChild() komponent rodzica może uzyskać dostęp do danych komponentu dziecka,
  • Za pomocą wspólnej instancji serwisu wstrzykniętego do obu komponentów,
  • Za pomocą współdzielonego obiektu Subject<T>

Dyrektywy

Do czego służą dyrektywy?

Dyrektywa (ang. directive) to klasa oznaczona dekoratorem @Directive(). Gdy Angular renderuje szablon, modyfikuje drzewo DOM zgodnie z instrukcjami określonymi przez dyrektywy. Określają one w jaki sposób elementy DOM powinny być dodawane lub modyfikowane.

Dyrektywy, podobnie do komponentów, posiadają swój cykl życia, z którego można skorzystać, aby zaimplementować lub skonfigurować ich zachowanie.

Wyróżniamy dwa rodzaje dyrektyw: strukturalne i atrybutowe.

Można również tworzyć własne dyrektywy za pomocą dekoratora @Directive().

Do najczęściej używanych dyrektyw należą: ngFor, ngIf, ngModel, ngStyle, ngClass.

Jaka jest różnica między dyrektywą a komponentem?

Komponent Dyrektywa
Anotacja @Component Anotacja @Directive
Komponent to dyrektywa z przypisanym szablonem, która używa shadow DOM do tworzenia nowych elementów widoku Dyrektywa dodaje nowe zachowania do istniejących elementów DOM
Pomaga podzielić aplikację na mniejsze fragmenty Pomaga wydzielić wspólne zachowania i używać ich w innych miejscach aplikacji
Jeden komponent może reprezentować jeden element DOM Wiele dyrektyw może opisywać jeden element DOM (nie dotyczy dyrektyw strukturalnych)

Jakie znasz rodzaje dyrektyw?

Dyrektywy dzielimy na trzy rodzaje:

  • Strukturalne (ang. structural directives) - zmieniają układ elementów DOM przez dodanie nowych elementów oraz usunięcie lub podmianę istniejących, np. dyrektywy *ngFor, *ngIf,
<li *ngFor="let fund of managedFunds"></li>
<app-fund *ngIf="fundActive"></app-fund>
  • Atrybutowe (ang. attribute directives) - zmieniają wygląd lub zachowanie istniejących elementów DOM, np. dyrektywy ngStyle, lub ngClass. W kodzie szablonów wyglądają jak zwykłe atrybuty HTML,
<input type="text" formControlName="currency" fundCurrency />
  • Komponenty - dyrektywy z dołączonym szablonem.

Dlaczego stosujemy znak gwiazdki (*) przed nazwą dyrektywy?

Znak gwiazdki * to tylko lukier syntaktyczny dla bardziej złożonej konstrukcji. Angular zamienia dyrektywę z *, np. *ngIf na <ng-template>, który opakowuje wskazany element, np.

Dyrektywa *ngIf została przeniesiona do <ng-template>, gdzie została powiązana z właściwością [ngIf]. Reszta kodu została przeniesiona do wnętrza elementu <ng-template>.

Podczas renderowania Angular usunie <ng-template> i zastąpi go komentarzem w kodzie HTML strony.

<div *ngIf='fund.active' class='details'>
    {{ fund.name }}
</div>
<ng-template [ngIf]='fund.active'>
    <div class='details'>{{ fund.name }}</div>
</ng-template>

Do czego służy TemplateRef i ViewContainerRef?

Każda dyrektywa strukturalna w Angular tworzy widok na podstawie elementu <ng-template> i umieszcza go w kontenerze obok oryginalnego elementu.

W kodzie komponentu TemplateRef reprezentuje właśnie taki element <ng-template>, a ViewContainerRef reprezentuje kontener, w którym znajdzie się wyrenderowany widok.

Aby uzyskać dostęp do obu tych elementów, wystarczy je wstrzyknąć w konstruktorze komponentu:

constructor(
 private template: TemplateRef<any>,
 private container: ViewContainerRef) { }

Następnie można stworzyć widok wywołując:

this.container.createEmbeddedView(this.template);

Jak zastosować *ngFor i *ngIf jednocześnie?

Próba użycia *ngFor i *ngIf na jednym elemencie spowoduje błąd kompilacji: "Can't have multiple template bindings on one element. Use only one attribute prefixed with *".

Jest to spowodowane tym, że nie można zastosować jednocześnie dwóch dyrektyw strukturalnych, ponieważ efekty ich działania mogłyby się wzajemnie nakładać.

Aby obejść ten problem, należy opakować element za pomocą <ng-container>, i na nim użyć jednej z dyrektyw.

<ng-container> pozwala grupować elementy, ale nie jest renderowany, przez co nie psuje layoutu strony ani stylów.

<div *ngFor='let fund of funds' class='details'>
    <ng-container *ngIf='fund.active'>
        {{ fund.name }}
    </ng-container>
</div>

Pipe

Do czego służy Pipe?

Pipe to klasa reprezentująca prostą funkcję formatującą dane w szablonach, np. liczby, waluty, daty lub złożone obiekty.

Może przyjmować parametry oraz łączyć się z innymi Pipe w łańcuchy wywołań, np.:

{{ fund.launchDate | date:'fullDate' | uppercase }}

Angular zawiera zestaw wbudowanych implementacji, m.in: DatePipe, CurrencyPipe, DecimalPipe, ale można również napisać własną implementując interfejs PipeTransform:

@Pipe({name: 'courseDate'})
export class CourseDate implements PipeTransform {
 transform(value: string) {
    return moment(value)
        .format('DD/MM/YY').toUpperCase();
 }
}

Do czego służy AsyncPipe?

AsyncPipe to wbudowana w Angular implementacja Pipe służąca do obsługi danych odbieranych asynchronicznie.

Przyjmuje jako parametr wejściowy Observable<T> lub Promise, automatycznie się do niego subskrybuje i zwraca najnowszą wartość, którą to źródło emituje.

Bez AsyncPipe, komponent musiałby sam zarządzać subskrypcją, odbieraniem danych od Observable oraz pamiętać o odsubskrybowaniu się na koniec, aby zapobiec wyciekom pamięci.

<div *ngFor='let fund of (funds$ | async)'>
    {{ fund.name }}
</div>

Czym się różni Pure Pipe od Impure Pipe?

Domyślnie każda implementacja Pipe w Angular jest Pure, co oznacza, że Angular wykona jej kod tylko wtedy, gdy wykryje tzw. pure change, czyli zmianę wartości wejściowej (String, Number, Boolean, Symbol) lub referencji (np. Date, Array, Function, Object).

Innymi słowy, Pure Pipe nie wykryje zmiany w złożonych obiektach, np. dodania elementu do istniejącej tablicy, ponieważ nie zmienia to referencji do tablicy. Dzięki temu kod wykonuje się szybciej.

Impure Pipe działa odwrotnie - Angular wykona jej kod zawsze gdy wykryje zmianę. Jest pomocna w sytuacjach, gdy chcemy wykrywać zmiany w obiektach złożonych. Należy jednak uważać, ponieważ zbyt częste używanie Impure Pipe może widocznie spowolnić działanie aplikacji i change detection.

Change detection

Jak działa mechanizm change detection?

Change detection jest procesem synchronizowania widoku z danymi. Proces w uproszczeniu działa według schematu:

  1. Angular porównuje bieżący stan danych z poprzednio zapamiętanym i zbiera wszystkie zmiany,
  2. Wywołuje ngOnInit, ngOnChanges i ngDoCheck z komponentów dzieci,
  3. Aktualizuje DOM komponentu aby odzwierciedlić zmiany w modelu,
  4. Uruchamia change detection dla komponentów dzieci,
  5. Wywołuje ngAfterViewInit z komponentów dzieci.

Change detection domyślnie nie przeprowadza głębokiego porównania złożonych obiektów. Porównywane są tylko wartości prymitywne, lub referencje do obiektów.

Co wywołuje change detection?

Change detection jest uruchamiane w reakcji na:

  • Inicjalizację komponentu – podczas tworzenia komponentów, Angular wywołuje ApplicationRef.tick(),
  • Uruchomienie event listenera – jeśli zdarzenie DOM jest powiązane z komponentem, np. przez (click) = "onClick()",
  • Żądanie HTTP wysłane przez HttpService,
  • MacroTask - zadanie asynchroniczne wykonane w kolejnej rundzie event loop, np. setTimeout(),
  • MircoTask – zadanie asynchroniczne wykonane w tej samej rundzie event loop, np. Promise.then(),
  • Inne zdarzenia asynchroniczne, np. związane z obsługą socketów WebSocket.onmessage().

Jakie znasz strategie change detection?

Wykorzystywane są dwie strategie change detection:

  • ChangeDetectionStrategy.Default – Domyślna strategia CheckAlways, w której wszystkie komponenty w drzewie komponentów (od czubka drzewa po sam dół) są sprawdzane pod kątem zmian przy każdym uruchomieniu change detection,
  • ChangeDetectionStrategy.OnPush – Strategia CheckOnce, w której sprawdzanie wywoływane jest tylko na żądanie, lub gdy zmieni się referencja do obiektu powiązanego z widokiem; dzięki temu można uniknąć niepotrzebnego sprawdzania wartości komponentu i wszystkich komponentów dzieci.

Co oznacza błąd "Expression has changed after it was checked"?

Problem występuje w sytuacji, gdy:

  • Widok sam próbuje wpłynąć na siebie np., gdy podczas tworzenia widoku komponentu zostanie wywołany kod, który ponownie zmienia jego wygląd, np. ukryty zostanie fragment, który przed chwilą miał być widoczny, lub gdy
  • Komponent dziecko próbuje zmienić właściwość komponentu rodzica po tym, jak rodzic zostanie już sprawdzony przez mechanizm change detection.

Aby obejść ten problem należy przenieść problematyczny fragment kodu do odpowiedniej metody cyklu życia komponentu.

Przykładowo, w przypadku zmian widoku można przenieść kod z metody ngAfterViewInit uruchamianej po wykonaniu zmian w DOM do metody ngOnInit, która jest wywoływana przed zmianami w DOM. Spowoduje to, że proces tworzenia widoku nie zostanie zakłócony.

Cykl życia komponentów

21. Czym jest lifecycle hook?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
22. W jakiej kolejności uruchamiane są lifecycle hooki?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
23. Jaka jest różnica pomiędzy ngOnInit a konstruktorem?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Dependency Injection

24. Jak działa Dependency Injection?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
25. Do czego służy Provider?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
26. Jak zapewnić, że @Service jest singletonem?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
27. Do czego służą dekoratory?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
28. Co to jest data binding?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Reactive Programming

29. Na czym polega Reactive Programming?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
30. Jaka jest różnica między Observable a Promise?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
31. Czym się różni hot od cold observable?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
32. Co różni switchMap, od concatMap i mergeMap?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
33. Kiedy trzeba (a kiedy nie) wywołać unsubscribe()?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Testowanie

34. Do czego służy TestBed?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Formularze

35. Co różni formularze Template-driven od Reactive Forms?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
36. Do czego służy ControlValueAccessor?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Optymalizacja

37. Jak zoptymalizować aplikację napisaną w Angularze?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
38. Jak zaimplementować lazy loading?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Security

39. Jak zabezpieczyć aplikację przed atakami?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
40. Jak zablokować dostęp do strony niezalogowanym użytkownikom?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
41. Do czego służy HTTP Interceptor?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Zagadnienia zaawansowane

42. Na czym polega kompilacja w Angularze?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
43. Jak działa kompilacja AOT?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
44. Jak włączyć renderowanie po stronie serwera?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
45. Czym jest View Encapsulation?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
46. Co to jest Shadow DOM?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
47. Co to jest zone.js?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
48. Jak zaktualizować model danych bez change detection?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
49. Do czego służy Service Worker w Angularze?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
50. Co to jest Ivy?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
51. Czym są Signals w Angular i jak ich używać?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
52. Czym są Standalone Components i jak migrować do tej architektury?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
53. Jak działa nowa składnia Control Flow (@if, @for, @switch)?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
54. Czym są Deferrable Views (@defer) i jak je wykorzystać?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
55. Jak działa funkcja inject() i kiedy jej używać zamiast konstruktora?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
56. Jak prawidłowo używać strategii OnPush z niemutowalnością danych?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
57. Jak tworzyć własne dyrektywy strukturalne?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
58. Jak działa zaawansowana projekcja treści z ng-content i ngTemplateOutlet?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
59. Jak uruchomić Angular bez zone.js (zoneless)?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi
60. Jak implementować zaawansowane wzorce RxJS w Angular?

Odpowiedź dostępna w pełnej wersji. Odblokuj 40 pozostałych odpowiedzi i ucz się z pełnego zestawu.

Odblokuj odpowiedzi

Chcesz poznać wszystkie odpowiedzi?

Uzyskaj pełny dostęp do 60 pytań rekrutacyjnych z Angular oraz pozostałych technologii.

Zobacz plany cenowe