Фронтенд-разработчик Angular (Начальный уровень)

Этот курс предназначен для начинающих и школьников, которые хотят освоить веб-разработку с нуля. Вы изучите основы Angular, научитесь создавать современные веб-приложения, работать с компонентами, данными и API. Курс даст практические навыки и подготовит к самостоятельной разработке реальных проектов.

Описание программы:

Курс разработан для начинающих фронтенд-разработчиков и направлен на освоение базовых навыков создания динамических веб-приложений с использованием фреймворка Angular. Обучение включает изучение TypeScript, архитектуры Angular-приложений, работы с компонентами, сервисами, шаблонами и маршрутизацией. В рамках курса слушатели реализуют несколько практических проектов и завершат обучение созданием одностраничного приложения (SPA), готового к интеграции с бэкендом.

 

Что предстоит пройти на курсе:

  • Введение в веб-разработку: HTML, CSS, JavaScript — основы
  • TypeScript: типы данных, интерфейсы, классы, декораторы
  • Основы Angular: архитектура приложения, модули, компоненты
  • Работа с шаблонами: привязки данных, директивы, пайпы
  • Сервисы и инъекции зависимостей: организация логики вне компонентов
  • Маршрутизация: настройка SPA с поддержкой нескольких страниц
  • Работа с формами: реактивные и шаблонные формы
  • HTTP-клиент: взаимодействие с REST API
  • Angular CLI: автоматизация сборки и управления проектом
  • Итоговая проектная работа: разработка полноценного Angular-приложения от идеи до деплоя
 

Ожидаемые результаты после прохождения курса:

Слушатель должен уметь:

 
  • Создавать одностраничные приложения на Angular
  • Использовать TypeScript и современные стандарты JavaScript
  • Разрабатывать и использовать компоненты, сервисы, модули
  • Находить и решать распространённые ошибки в коде
  • Интегрировать фронтенд с бэкендом через HTTP-запросы
  • Работать с формами и валидацией
  • Настраивать маршрутизацию в SPA
  • Публиковать готовое приложение
 

Слушатель должен знать:

  • Базовые принципы клиентской веб-разработки
  • Структуру и архитектурные особенности Angular
  • Основы TypeScript и его роль в Angular-разработке
  • Принципы разделения ответственности между компонентами и сервисами
  • Механизмы работы с данными и пользовательским интерфейсом
 

Дополнительно:

  • Введение в Git и работу с репозиториями
  • Основы организации рабочего процесса во фронтенде
  • Советы по трудоустройству: создание портфолио, GitHub, собеседования
  • Рекомендации по дальнейшему развитию в веб-разработке
 

Итоговая аттестация:

  • Выполнение и защита дипломного проекта
  • Тестирование знаний по пройденным темам
  • Получение сертификата об окончании курса
  1. Что такое Angular и для чего он используется?
    Angular — это JavaScript-фреймворк с открытым исходным кодом, разработанный Google для создания одностраничных приложений (SPA).

  2. Какие основные особенности Angular вы знаете?
    TypeScript, модульность, компонентно-ориентированная архитектура, маршрутизация, реактивные формы, инъекция зависимостей.

  3. Что такое SPA и как Angular помогает в его создании?
    SPA — это веб-приложение, которое загружается один раз и обновляется динамически. Angular предоставляет все необходимые инструменты для реализации SPA.

  4. Что такое TypeScript и почему он важен для Angular?
    TypeScript — это надстройка над JavaScript с поддержкой статической типизации, которая улучшает читаемость и масштабируемость кода. Angular использует TypeScript как основной язык разработки.

  5. Что такое компонент в Angular?
    Компонент — это основной строительный блок Angular-приложения, который связывает логику, шаблон и стили.

  6. Что включает в себя декоратор @Component?
    Декоратор @Component определяет метаданные компонента: selector, templateUrl, styleUrls и другие параметры.

  7. Что такое модуль в Angular?
    Модуль — это контейнер, который объединяет компоненты, директивы, сервисы и другие элементы приложения. Основной модуль называется AppModule.

  8. Что такое директивы в Angular? Чем они отличаются от компонентов?
    Директивы изменяют поведение или внешний вид DOM-элементов. В отличие от компонентов, у них нет собственного шаблона.

  9. Что такое пайпы в Angular и приведите пример их использования.
    Пайпы используются для преобразования данных в шаблонах. Например, {{ date | date }} выводит дату в нужном формате.

  10. Что такое сервисы в Angular и зачем они нужны?
    Сервисы содержат бизнес-логику и данные, не связанные напрямую с пользовательским интерфейсом. Они помогают организовать повторное использование кода.

  11. Что такое инъекция зависимостей (DI) в Angular?
    Это механизм, позволяющий автоматически передавать зависимости (например, экземпляры сервисов) в компоненты или другие классы.

  12. Что такое маршрутизация в Angular и как она настраивается?
    Маршрутизация позволяет переходить между различными представлениями приложения. Настраивается через RouterModule и Routes.

  13. Как добавить новый компонент в Angular-проект?
    С помощью команды Angular CLI: ng generate component my-component или вручную, создав класс и декоратор @Component.

  14. Что такое жизненный цикл компонента в Angular?
    Это набор методов (хуков), которые вызываются на разных этапах существования компонента: ngOnInit, ngOnDestroy и другие.

  15. Что такое двухстороннее связывание данных в Angular?
    Это механизм, при котором изменения в модели сразу отражаются в представлении и наоборот. Реализуется с помощью [(ngModel)].

  16. Как работает привязка данных в Angular?
    Angular поддерживает несколько видов привязки: интерполяция {{ }}, свойства [property], события (event), и двухсторонняя [(ngModel)].

  17. Что такое HTTP-клиент в Angular и как он используется?
    HttpClient — это модуль Angular для выполнения HTTP-запросов к бэкенду. Используется для получения и отправки данных.

  18. Что такое реактивные формы в Angular?
    Реактивные формы — это способ управления состоянием формы через программный подход, с использованием FormGroup, FormControl и FormBuilder.

  19. Чем отличаются реактивные формы от шаблонных форм?
    Реактивные формы более предсказуемы и подходят для сложных форм, тогда как шаблонные формы удобны для простых случаев и управляются из шаблона.

  20. Что такое Observables и зачем они нужны в Angular?
    Observables — это объекты, предоставляющие поток данных, которые можно подписаться и обрабатывать. Используются для работы с асинхронными операциями, такими как HTTP-запросы.

  21. Что такое RxJS и как он связан с Angular?
    RxJS — это библиотека реактивного программирования, используемая в Angular для работы с Observables и асинхронными операциями.

  22. Как установить и использовать Angular CLI?
    Angular CLI устанавливается через npm: npm install -g @angular/cli. Затем можно создавать проекты и генерировать файлы с помощью команд, например, ng new или ng generate.

  23. Как опубликовать Angular-приложение?
    После сборки с помощью ng build, файлы из папки dist можно загрузить на хостинг или использовать инструменты вроде Firebase Hosting, Netlify, Vercel.

  24. Что такое ViewChild и ViewChildren в Angular?
    Это декораторы, которые позволяют получать доступ к дочерним элементам или компонентам из шаблона в коде.

  25. Какие рекомендации по организации структуры проекта в Angular вы знаете?
    Создавать отдельные папки для компонентов, сервисов, модулей, использовать feature модули, разделять логику и UI, следовать соглашениям Angular Style Guide.

  1. Что такое интерполяция в Angular и как она используется?
    Интерполяция — это способ вывода данных в шаблоне через двойные фигурные скобки, например: {{ title }}.

  2. Какие типы директив существуют в Angular?
    Существует три типа директив: компоненты, структурные директивы (например, *ngIf, *ngFor), атрибутные директивы (например, ngClass, ngStyle).

  3. Что такое структурная директива? Приведите пример.
    Структурная директива изменяет структуру DOM. Пример: *ngFor используется для циклического отображения элементов.

  4. Что такое атрибутная директива? Приведите пример.
    Атрибутная директива изменяет внешний вид или поведение DOM-элемента. Пример: ngClass добавляет классы к элементу динамически.

  5. Как создать собственную директиву в Angular?
    С помощью команды Angular CLI: ng generate directive my-directive. Затем реализовать логику в файле директивы и подключить её в модуле.

  6. Что такое пайп (pipe) и как его создать?
    Пайп преобразует данные перед выводом в шаблоне. Собственный пайп создаётся с помощью команды ng generate pipe my-pipe и реализации метода transform().

  7. Что такое асинхронный пайп в Angular?
    AsyncPipe автоматически подписывается на Observable или Promise и возвращает значение, обновляя шаблон при его изменении.

  8. Что такое инпуты и аутпуты в Angular?
    @Input() позволяет передавать данные из родительского компонента в дочерний. @Output() используется для отправки событий из дочернего компонента в родительский.

  9. Что такое жизненный цикл сервиса в Angular?
    Жизненный цикл сервиса зависит от области его предоставления. Если он зарегистрирован в корневом модуле, то существует всё время работы приложения.

  10. Как использовать HttpClient в Angular?
    Сначала импортировать HttpClientModule в AppModule. Затем внедрить HttpClient в сервис через конструктор и вызвать методы get(), post() и т.д.

  11. Что такое observable и как его подписаться?
    Observable — это поток данных. Подписка осуществляется с помощью метода subscribe(), где можно указать callback для получения данных.

  12. Что такое оператор map в RxJS и как он используется?
    Оператор map преобразует данные из одного вида в другой. Используется в цепочке Observable, например, после HTTP-запроса.

  13. Что такое catchError в RxJS?
    catchError перехватывает ошибки в Observable и позволяет выполнить действие, например, вернуть дефолтное значение или обработать ошибку.

  14. Что такое Subject и чем он отличается от Observable?
    Subject — это особый тип Observable, который позволяет рассылать данные всем подписчикам. Он может быть источником и получателем данных.

  15. Что такое BehaviorSubject и зачем он нужен?
    BehaviorSubject — это тип Subject, который хранит последнее значение и отправляет его новым подписчикам при их подключении.

  16. Что такое ngOnDestroy и когда он вызывается?
    Это хук жизненного цикла, который вызывается перед уничтожением компонента. Часто используется для отписки от Observable.

  17. Что такое ViewChild и как получить доступ к элементу?
    ViewChild позволяет получить прямой доступ к элементу DOM или экземпляру компонента в шаблоне через свойство в классе компонента.

  18. Что такое HostListener и HostBinding в Angular?
    HostListener реагирует на события хост-элемента, HostBinding связывает свойства хост-элемента с данными компонента.

  19. Что такое ContentChild и чем он отличается от ViewChild?
    ContentChild используется для доступа к контенту, проектируемому через <ng-content>, тогда как ViewChild обращается к элементам внутри собственного шаблона.

  20. Что такое маршруты с параметрами и как их получить?
    Маршруты с параметрами позволяют передавать данные через URL. Получают их через ActivatedRoute.snapshot.params или subscribe().

  21. Что такое canActivate в маршрутизации?
    canActivate — это защитник маршрута, который определяет, разрешено ли пользователю перейти на определённую страницу.

  22. Что такое resolve в маршрутизации и зачем он нужен?
    Resolve — это механизм предварительной загрузки данных перед активацией маршрута, чтобы не показывать пустую страницу.

  23. Что такое lazy loading в Angular и как он работает?
    Lazy loading — это подход, при котором модуль загружается только при необходимости, что улучшает производительность при первом запуске.

  24. Что такое environment в Angular и как его использовать?
    Environment — это файлы с переменными окружения, которые используются для хранения настроек, таких как API-ключи или режим разработки/продакшена.

  25. Как организовать работу с формами в Angular?
    Angular поддержает две формы работы: шаблонные формы (через #templateReference) и реактивные формы (через FormGroup, FormControl).

  1. Что такое декоратор @NgModule и для чего он используется?
    @NgModule используется для определения модуля Angular, который группирует компоненты, директивы, пайпы и сервисы. Определяет, что включает модуль и какие зависимости требуются.

  2. Какие основные секции есть у декоратора @NgModule?
    Основные секции: declarations (компоненты, директивы, пайпы), imports (внешние модули), exports (что доступно другим модулям), providers (сервисы), bootstrap (корневой компонент).

  3. Что такое Angular CLI и каковы его основные команды?
    Angular CLI — это инструмент командной строки для автоматизации создания и управления проектами. Основные команды: ng new, ng generate, ng serve, ng build, ng test.

  4. Что такое интерфейс в TypeScript и как он используется в Angular?
    Интерфейс определяет форму объекта. В Angular часто используется для описания структуры данных, например, при работе с API.

  5. Что такое класс в TypeScript и как он используется в Angular?
    Класс — это шаблон для создания объектов. В Angular классы используются для реализации компонентов, сервисов и других частей приложения.

  6. Что такое декоратор @Injectable и где он применяется?
    @Injectable используется для пометки класса как сервиса, который может быть внедрён через DI. Обычно применяется в сервисах.

  7. Что такое сервис с providedIn: 'root'?
    Это способ регистрации сервиса на уровне корневого модуля, чтобы он был доступен во всём приложении без необходимости добавления в providers.

  8. Что такое lazy loading модулей и как его настроить?
    Lazy loading — это загрузка модулей по требованию. Настраивается через маршрутизацию с указанием loadChildren вместо components.

  9. Как использовать роутинг в Angular?
    Роутинг настраивается в файле app-routing.module.ts, где создаётся массив маршрутов и подключается RouterModule.forRoot(routes).

  10. Что такое ActivatedRoute и как он используется?
    ActivatedRoute предоставляет информацию о текущем маршруте, включая параметры, данные, дочерние маршруты и т.д.

  11. Что такое RouterOutlet и для чего он нужен?
    RouterOutlet — это директива, которая служит местом отображения содержимого, связанного с текущим маршрутом.

  12. Как передавать данные между компонентами в Angular?
    Через @Input() и @Output(), через сервисы, через маршруты (data или параметры), через RxJS Subject/BehaviorSubject.

  13. Что такое EventEmitter в Angular?
    EventEmitter — это механизм, используемый с @Output(), для отправки событий из дочернего компонента в родительский.

  14. Что такое двухстороннее связывание и как оно реализуется в Angular?
    Двухстороннее связывание позволяет синхронизировать модель и представление. Реализуется через [(ngModel)].

  15. Что такое NgModel и в каком модуле он находится?
    NgModel — это директива для двухстороннего связывания. Находится в FormsModule.

  16. Что такое реактивные формы и какие классы они используют?
    Реактивные формы строятся с использованием классов FormGroup, FormControl, FormArray и FormBuilder.

  17. Что такое FormBuilder и зачем он нужен?
    FormBuilder — это удобный способ создания форм в Angular, позволяющий создавать FormGroup и FormControl с меньшим количеством кода.

  18. Как проверять валидность формы в Angular?
    С помощью свойства valid у FormGroup или FormControl. Также можно использовать Validators.required, Validators.email и другие.

  19. Что такое observable и как он отличается от promise?
    Observable — это поток данных, который может иметь несколько значений и поддерживает операторы. Promise — однократное выполнение с одним результатом.

  20. Что такое subscribe и когда он используется?
    subscribe — метод, который активирует подписку на Observable и позволяет получать данные, ошибки и завершение потока.

  21. Что такое pipe async и как он работает?
    AsyncPipe автоматически подписывается на Observable или Promise и возвращает значение, обновляя шаблон при изменении.

  22. Что такое HTTP Interceptor и зачем он нужен?
    HTTP Interceptor — это механизм перехвата и изменения HTTP-запросов и ответов, например, для добавления заголовков или логирования.

  23. Как установить и использовать HttpClientModule?
    HttpModule заменён на HttpClientModule. Он импортируется в AppModule и предоставляет HttpClient для работы с REST API.

  24. Что такое environment.prod.ts и для чего он используется?
    Это файл окружения, содержащий настройки для продакшена, такие как URL API. Используется для разделения конфигураций между разными средами.

  25. Как тестировать компоненты в Angular?
    Тестирование проводится с использованием Jasmine и Karma через файл .spec.ts. Можно проверять логику, шаблоны, взаимодействие с сервисами.

  1. Какой язык программирования используется по умолчанию в Angular?
    A) JavaScript
    B) TypeScript
    C) Dart
    D) CoffeeScript
    Правильный ответ: B) TypeScript

  2. Что из перечисленного является основным строительным блоком Angular-приложения?
    A) Сервис
    B) Модуль
    C) Компонент
    D) Пайп
    Правильный ответ: C) Компонент

  3. Какой декоратор используется для создания компонента в Angular?
    A) @NgModule
    B) @Component
    C) @Injectable
    D) @Directive
    Правильный ответ: B) @Component

  4. Что такое SPA?
    A) Статическая HTML-страница
    B) Веб-приложение, загружаемое за один раз
    C) База данных
    D) REST API
    Правильный ответ: B) Веб-приложение, загружаемое за один раз

  5. Какой модуль Angular используется для работы с HTTP-запросами?
    A) HttpClientModule
    B) FormsModule
    C) RouterModule
    D) BrowserModule
    Правильный ответ: A) HttpClientModule

  6. Какой символ используется для интерполяции данных в шаблоне Angular?
    A) []
    B) ()
    C) {{ }}
    D) #

Правильный ответ: C) {{ }}

  1. Какой директивы не существует в Angular?
    A) *ngIf
    B) *ngFor
    C) *ngSwitch
    D) *ngWhile
    *Правильный ответ: D) ngWhile

  2. Какой тип формы НЕ поддерживается в Angular?
    A) Шаблонная форма
    B) Реактивная форма
    C) Динамическая форма
    D) MVC форма
    Правильный ответ: D) MVC форма

  3. Для чего используется @Input() в компоненте?
    A) Для отправки событий
    B) Для передачи данных от родителя к дочернему
    C) Для доступа к DOM
    D) Для маршрутизации
    Правильный ответ: B) Для передачи данных от родителя к дочернему

  4. Для чего используется @Output() в компоненте?
    A) Для получения данных от дочернего
    B) Для передачи данных от дочернего к родителю
    C) Для вызова HTTP-запроса
    D) Для изменения стиля элемента
    Правильный ответ: B) Для передачи данных от дочернего к родителю

  5. Как называется корневой модуль Angular-приложения?
    A) AppModule
    B) MainModule
    C) CoreModule
    D) RootModule
    Правильный ответ: A) AppModule

  6. Какой инструмент используется для создания проектов и генерации файлов в Angular?
    A) WebStorm
    B) Angular CLI
    C) VS Code
    D) Node.js
    Правильный ответ: B) Angular CLI

  7. Какая команда создает новый Angular-проект?
    A) ng generate project
    B) ng new my-app
    C) npm create angular-app
    D) ng init
    Правильный ответ: B) ng new my-app

  8. Что такое Observables в Angular?
    A) Объекты для хранения данных
    B) Асинхронные потоки данных
    C) Статические методы
    D) Типы данных
    Правильный ответ: B) Асинхронные потоки данных

  9. Какой оператор RxJS используется для преобразования данных?
    A) catchError
    B) map
    C) tap
    D) take
    Правильный ответ: B) map

  10. Какой сервис используется для маршрутизации между страницами?
    A) ActivatedRoute
    B) Router
    C) Location
    D) Http
    Правильный ответ: B) Router

  11. Как получить параметры маршрута в Angular?
    A) Через Router.params
    B) Через ActivatedRoute.snapshot.params
    C) Через Location.path()
    D) Через Route.params
    Правильный ответ: B) Через ActivatedRoute.snapshot.params

  12. Что такое lazy loading в Angular?
    A) Загрузка всех модулей сразу
    B) Загрузка модулей по требованию
    C) Упрощённая маршрутизация
    D) Минификация кода
    Правильный ответ: B) Загрузка модулей по требованию

  13. Как зарегистрировать сервис на уровне всего приложения?
    A) Добавить в providers модуля
    B) Использовать providedIn: 'root'
    C) Экспортировать из модуля
    D) Подключить через import
    Правильный ответ: B) Использовать providedIn: 'root'

  14. Какой механизм позволяет подписаться на изменения Observable?
    A) watch()
    B) on()
    C) subscribe()
    D) listen()
    Правильный ответ: C) subscribe()

  15. Что делает async pipe в Angular?
    A) Отправляет данные на сервер
    B) Автоматически подписывается на Observable или Promise
    C) Изменяет стиль элемента
    D) Выполняет анимацию
    Правильный ответ: B) Автоматически подписывается на Observable или Promise

  16. Какой файл содержит переменные окружения для продакшена в Angular?
    A) environment.ts
    B) environment.prod.ts
    C) config.ts
    D) settings.json
    Правильный ответ: B) environment.prod.ts

  17. Какой пайп используется для форматирования даты?
    A) number
    B) currency
    C) date
    D) format
    Правильный ответ: C) date

  18. Что такое ViewChild в Angular?
    A) Метод
    B) Декоратор
    C) Класс
    D) Интерфейс
    Правильный ответ: B) Декоратор

  19. Какой командой можно запустить Angular-приложение локально?
    A) ng build
    B) ng serve
    C) npm start
    D) ng run
    Правильный ответ: B) ng serve

  1. Какой из следующих элементов не является частью архитектуры Angular?
    A) Компоненты
    B) Сервисы
    C) Контроллеры
    D) Модули
    Правильный ответ: C) Контроллеры

  2. Что такое декоратор @Directive в Angular?
    A) Используется для создания компонентов
    B) Применяется для создания пользовательских директив
    C) Нужен для маршрутизации
    D) Определяет сервис
    Правильный ответ: B) Применяется для создания пользовательских директив

  3. Как создать кастомную директиву с помощью Angular CLI?
    A) ng create directive
    B) ng generate directive
    C) ng new directive
    D) ng add directive
    Правильный ответ: B) ng generate directive

  4. Какой тип директивы изменяет структуру DOM?
    A) Атрибутная директива
    B) Структурная директива
    C) Компонент
    D) Пайп
    Правильный ответ: B) Структурная директива

  5. Какая директива применяется для динамического добавления класса к элементу?
    A) *ngIf
    B) *ngFor
    C) [ngClass]
    D) [ngStyle]
    Правильный ответ: C) [ngClass]

  6. Какой метод жизненного цикла вызывается после инициализации компонента?
    A) ngOnDestroy
    B) ngOnInit
    C) constructor
    D) ngAfterViewInit
    Правильный ответ: B) ngOnInit

  7. Какой метод жизненного цикла вызывается перед уничтожением компонента?
    A) ngOnChanges
    B) ngOnInit
    C) ngOnDestroy
    D) ngDoCheck
    Правильный ответ: C) ngOnDestroy

  8. Что такое инъекция зависимостей в Angular?
    A) Подключение CSS-файлов
    B) Передача данных через маршруты
    C) Автоматическое предоставление сервисов
    D) Создание новых компонентов
    Правильный ответ: C) Автоматическое предоставление сервисов

  9. Как внедрить сервис в компонент?
    A) Через конструктор
    B) Через шаблон
    C) Через декоратор @ViewChild
    D) Через переменные окружения
    Правильный ответ: A) Через конструктор

  10. Что означает providedIn: 'root' в декораторе @Injectable?
    A) Сервис будет доступен только в текущем компоненте
    B) Сервис будет зарегистрирован глобально
    C) Сервис будет использоваться только в модуле
    D) Сервис будет загружен по требованию
    Правильный ответ: B) Сервис будет зарегистрирован глобально

  11. Что такое маршрутизация в Angular?
    A) Обработка HTTP-запросов
    B) Переход между представлениями приложения
    C) Управление формами
    D) Работа с сервисами
    Правильный ответ: B) Переход между представлениями приложения

  12. Какой директивой отображается содержимое маршрута?
    A) <router>
    B) <route>
    C) <router-outlet>
    D) <app-router>
    Правильный ответ: C) <router-outlet>

  13. Как получить параметры из URL в Angular?
    A) ActivatedRoute.params
    B) Router.url
    C) Location.path()
    D) Route.snapshot
    Правильный ответ: A) ActivatedRoute.params

  14. Что делает метод subscribe()?
    A) Завершает выполнение программы
    B) Отписывается от события
    C) Подписывается на Observable
    D) Выполняет синхронный запрос
    Правильный ответ: C) Подписывается на Observable

  15. Какой оператор RxJS используется для обработки ошибок?
    A) map
    B) tap
    C) catchError
    D) filter
    Правильный ответ: C) catchError

  16. Что такое Subject в RxJS?
    A) Тип данных
    B) Специальный класс, позволяющий рассылать данные всем подписчикам
    C) Метод
    D) Интерфейс
    Правильный ответ: B) Специальный класс, позволяющий рассылать данные всем подписчикам

  17. Что такое BehaviorSubject?
    A) Обычный массив
    B) Observable, который всегда возвращает последнее значение
    C) Метод маршрутизации
    D) Директива
    Правильный ответ: B) Observable, который всегда возвращает последнее значение

  18. Какой файл Angular использует для хранения настроек сборки проекта?
    A) package.json
    B) angular.json
    C) tsconfig.json
    D) .gitignore
    Правильный ответ: B) angular.json

  19. Как собрать проект с помощью Angular CLI?
    A) ng start
    B) ng run
    C) ng build
    D) ng compile
    Правильный ответ: C) ng build

  20. Как опубликовать Angular-приложение на GitHub Pages?
    A) ng deploy
    B) ng publish
    C) ng deploy --github-pages
    D) npm deploy
    Правильный ответ: C) ng deploy --github-pages

  21. Какой командой можно проверить версию Angular CLI?
    A) ng -v
    B) node -v
    C) npm -v
    D) cli -version
    Правильный ответ: A) ng -v

  22. Какой пайп используется для форматирования валюты?
    A) date
    B) number
    C) currency
    D) percent
    Правильный ответ: C) currency

  23. Что такое ViewChild и как его использовать?
    A) Для создания нового компонента
    B) Для получения ссылки на дочерний элемент или компонент
    C) Для изменения стиля
    D) Для маршрутизации
    Правильный ответ: B) Для получения ссылки на дочерний элемент или компонент

  24. Какой метод позволяет отписаться от Observable?
    A) unsubscribe()
    B) stop()
    C) cancel()
    D) end()
    Правильный ответ: A) unsubscribe()

  25. Что такое environment.ts в Angular?
    A) Файл с логами
    B) Файл с переменными окружения
    C) Конфигурационный файл для стилей
    D) Файл с HTML-шаблонами
    Правильный ответ: B) Файл с переменными окружения

  1. Какой из следующих элементов не является директивой в Angular?
    A) *ngIf
    B) *ngFor
    C) *ngSwitchCase
    D) *ngFunction
    *Правильный ответ: D) ngFunction

  2. Что делает декоратор @HostBinding?
    A) Связывает свойства хост-элемента с данными компонента
    B) Обрабатывает события хост-элемента
    C) Указывает путь к шаблону
    D) Регистрирует сервис
    Правильный ответ: A) Связывает свойства хост-элемента с данными компонента

  3. Что такое ContentChild в Angular?
    A) Получает доступ к дочерним элементам внутри собственного шаблона
    B) Получает доступ к контенту, переданному через <ng-content>
    C) Создаёт новый модуль
    D) Передаёт данные через маршруты
    Правильный ответ: B) Получает доступ к контенту, переданному через <ng-content>

  4. Какой метод жизненного цикла вызывается при каждом изменении привязанных данных?
    A) ngOnInit
    B) ngOnChanges
    C) ngAfterViewInit
    D) ngOnDestroy
    Правильный ответ: B) ngOnChanges

  5. Какая команда создаёт новый компонент в Angular CLI?
    A) ng new component my-component
    B) ng generate component my-component
    C) ng create component my-component
    D) ng add component my-component
    Правильный ответ: B) ng generate component my-component

  6. Какой тип форм в Angular позволяет использовать FormBuilder?
    A) Шаблонные формы
    B) MVC формы
    C) Реактивные формы
    D) JSON формы
    Правильный ответ: C) Реактивные формы

  7. Как получить доступ к данным маршрута до активации компонента?
    A) ActivatedRoute.snapshot.data
    B) Resolve guard
    C) CanActivate guard
    D) Router.events
    Правильный ответ: B) Resolve guard

  8. Что такое canActivate в маршрутизации?
    A) Защитник маршрута, проверяющий права пользователя на вход
    B) Метод для загрузки данных
    C) Директива
    D) Пайп
    Правильный ответ: A) Защитник маршрута, проверяющий права пользователя на вход

  9. Какой модуль нужно импортировать для работы с реактивными формами?
    A) FormsModule
    B) ReactiveFormsModule
    C) CommonModule
    D) RouterModule
    Правильный ответ: B) ReactiveFormsModule

  10. Как называется класс, используемый для создания группы контролов в реактивных формах?
    A) FormControl
    B) FormGroup
    C) FormArray
    D) FormBuilder
    Правильный ответ: B) FormGroup

  11. Какой метод используется для установки значения FormControl?
    A) setValue()
    B) set()
    C) updateValue()
    D) patch()
    Правильный ответ: A) setValue()

  12. Что означает dirty у FormControl?
    A) Поле было изменено пользователем
    B) Поле не прошло валидацию
    C) Поле обязательное
    D) Поле отключено
    Правильный ответ: A) Поле было изменено пользователем

  13. Что такое tap в RxJS?
    A) Подписка на Observable
    B) Оператор для выполнения побочных действий
    C) Обработка ошибок
    D) Отписка от Observable
    Правильный ответ: B) Оператор для выполнения побочных действий

  14. Какой командой можно проверить список установленных пакетов в проекте?
    A) ng list
    B) npm list
    C) node list
    D) cli packages
    Правильный ответ: B) npm list

  15. Какой файл используется для настройки TypeScript в Angular-проекте?
    A) package.json
    B) angular.json
    C) tsconfig.json
    D) environment.ts
    Правильный ответ: C) tsconfig.json

  16. Как добавить CSS-класс к элементу динамически в Angular?
    A) [class]
    B) [ngClass]
    C) [style]
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

  17. Какой атрибут HTML используется для связи с переменной шаблона в Angular?
    A) #
    B) @
    C) $
    D) &
    Правильный ответ: A) #

  18. Как создать кастомный пайп в Angular?
    A) ng new pipe
    B) ng generate pipe
    C) ng create pipe
    D) ng add pipe
    Правильный ответ: B) ng generate pipe

  19. Что делает async pipe в шаблоне?
    A) Запускает HTTP-запрос
    B) Автоматически подписывается на Observable и обновляет шаблон
    C) Возвращает Promise
    D) Управляет маршрутизацией
    Правильный ответ: B) Автоматически подписывается на Observable и обновляет шаблон

  20. Что такое interceptor в Angular?
    A) Компонент
    B) Сервис
    C) Механизм перехвата HTTP-запросов и ответов
    D) Пайп
    Правильный ответ: C) Механизм перехвата HTTP-запросов и ответов

  21. Как зарегистрировать interceptor в Angular?
    A) Через providers в модуле
    B) Через imports в модуле
    C) Через declarations в модуле
    D) Через exports в модуле
    Правильный ответ: A) Через providers в модуле

  22. Что такое TestBed в Angular?
    A) Сервис для HTTP-запросов
    B) Инструмент для тестирования компонентов
    C) Модуль маршрутизации
    D) Плагин для сборки
    Правильный ответ: B) Инструмент для тестирования компонентов

  23. Какой фреймворк используется для тестирования в Angular?
    A) Mocha
    B) Jasmine
    C) Jest
    D) QUnit
    Правильный ответ: B) Jasmine

  24. Какой метод используется для имитации HTTP-ответа в тестах?
    A) HttpClient.get()
    B) TestBed.inject()
    C) HttpTestingController
    D) Router.navigateByUrl
    Правильный ответ: C) HttpTestingController

  25. Какой командой запускаются юнит-тесты в Angular?
    A) ng test
    B) ng run tests
    C) npm test
    D) ng start --test
    Правильный ответ: A) ng test

Экзаменационный билет №1

Теоретическая часть

  1. Что такое Angular? Какие основные преимущества у этого фреймворка перед другими?
  2. Объясните разницу между ngIf и hidden в Angular.

Ответы на теоретическую часть:

  1. Angular — это фреймворк для создания SPA (Single Page Applications), разработанный Google. Основные преимущества:
    • Двустороннее связывание данных (two-way data binding).
    • Модульность и зависимость на компонентах.
    • Встроенный Dependency Injection.
    • Использование TypeScript для строгой типизации.
    • Полноценный фреймворк (роутинг, HTTP-клиент, формы и т. д.).
  2. *ngIf полностью удаляет элемент из DOM, если условие ложно, а hidden просто скрывает элемент через CSS (display: none).

Практическая часть
Создайте компонент UserCard, который принимает @Input():

  • name: string
  • age: number
  • isActive: boolean

Если isActive === true, выводите текст "Активен", иначе — "Неактивен".

typescript

 

Copy

 

Download

// user-card.component.ts

import { Component, Input } from '@angular/core';

 

@Component({

  selector: 'app-user-card',

  template: `

    <div>

      <h3>{{ name }}</h3>

      <p>Возраст: {{ age }}</p>

      <p>Статус: {{ isActive ? 'Активен' : 'Неактивен' }}</p>

    </div>

  `,

})

export class UserCardComponent {

  @Input() name!: string;

  @Input() age!: number;

  @Input() isActive!: boolean;

}


Экзаменационный билет №2

Теоретическая часть

  1. Что такое NgModule в Angular? Перечислите основные свойства декоратора.
  2. Как работает *ngFor? Приведите пример использования.

Ответы на теоретическую часть:

  1. NgModule — это декоратор, определяющий модуль Angular. Основные свойства:
    • declarations (компоненты, директивы, пайпы).
    • imports (другие модули).
    • providers (сервисы).
    • bootstrap (корневой компонент).
  2. *ngFor — структурная директива для перебора массивов:

html

 

Copy

 

Download

 

 

Run

<ul>

  <li *ngFor="let item of items; index as i">{{ i + 1 }}. {{ item }}</li>

</ul>

Практическая часть
Создайте сервис DataService с методом getUsers(), возвращающим массив пользователей. Используйте его в компоненте для вывода списка через *ngFor.

typescript

 

Copy

 

Download

// data.service.ts

import { Injectable } from '@angular/core';

 

@Injectable({

  providedIn: 'root',

})

export class DataService {

  getUsers() {

    return [

      { name: 'Alice', age: 25 },

      { name: 'Bob', age: 30 },

    ];

  }

}

 

// user-list.component.ts

import { Component } from '@angular/core';

import { DataService } from './data.service';

 

@Component({

  selector: 'app-user-list',

  template: `

    <ul>

      <li *ngFor="let user of users">

        {{ user.name }} ({{ user.age }})

      </li>

    </ul>

  `,

})

export class UserListComponent {

  users: any[];

 

  constructor(private dataService: DataService) {

    this.users = this.dataService.getUsers();

  }

}


Экзаменационный билет №3

Теоретическая часть

  1. Что такое @Input() и @Output()? Приведите примеры.
  2. Как работает EventEmitter?

Ответы на теоретическую часть:

  1. @Input() — передача данных в дочерний компонент.
    @Output() — генерация событий из дочернего в родительский.
    Пример:

typescript

 

Copy

 

Download

@Input() item: string;

@Output() delete = new EventEmitter<string>();

  1. EventEmitter — это класс для кастомных событий. Используется с @Output().

Практическая часть
Создайте компонент ButtonComponent с @Output() onClick, который при клике вызывает событие с текстом "Кнопка нажата!"

typescript

Copy

Download

// button.component.ts

import { Component, Output, EventEmitter } from '@angular/core';

 

@Component({

  selector: 'app-button',

  template: `<button (click)="handleClick()">Нажми меня</button>`,

})

export class ButtonComponent {

  @Output() onClick = new EventEmitter<string>();

 

  handleClick() {

    this.onClick.emit('Кнопка нажата!');

  }

}


Экзаменационный билет №4

Теоретическая часть

  1. Что такое Observable и как его использовать в Angular?
  2. Как подписаться на Observable и отписаться?

Ответы на теоретическую часть:

  1. Observable — объект из библиотеки RxJS для асинхронных операций (например, HTTP-запросов).
  2. Подписка:

typescript

Copy

Download

const subscription = observable.subscribe(data => console.log(data));

subscription.unsubscribe(); // Отписка

Практическая часть
Используйте HttpClient для запроса к API (например, https://jsonplaceholder.typicode.com/users) и вывода списка пользователей.

typescript

Copy

Download

// user.service.ts

import { Injectable } from '@angular/core';

import { HttpClient } from '@angular/common/http';

 

@Injectable({

  providedIn: 'root',

})

export class UserService {

  constructor(private http: HttpClient) {}

 

  getUsers() {

    return this.http.get('https://jsonplaceholder.typicode.com/users');

  }

}

 

// user-list.component.ts

import { Component, OnInit } from '@angular/core';

import { UserService } from './user.service';

 

@Component({

  selector: 'app-user-list',

  template: `

    <ul>

      <li *ngFor="let user of users">

        {{ user.name }}

      </li>

    </ul>

  `,

})

export class UserListComponent implements OnInit {

  users: any[] = [];

 

  constructor(private userService: UserService) {}

 

  ngOnInit() {

    this.userService.getUsers().subscribe((data: any) => {

      this.users = data;

    });

  }

}


Экзаменационный билет №5

Теоретическая часть

  1. Что такое Директива в Angular? Назовите встроенные директивы.
  2. Как создать свою собственную директиву?

Ответы на теоретическую часть:

  1. Директива — это инструкция для DOM (например, *ngIf, *ngFor, ngClass).
  2. Создание директивы:

bash

Copy

Download

ng generate directive highlight

Пример:

typescript

Copy

Download

@Directive({

  selector: '[appHighlight]',

})

export class HighlightDirective {

  @HostListener('mouseenter') onMouseEnter() {

    // Логика

  }

}

Практическая часть
Создайте директиву appHighlight, которая меняет цвет фона элемента на желтый при наведении.

typescript

Copy

Download

// highlight.directive.ts

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({

  selector: '[appHighlight]',

})

export class HighlightDirective {

  constructor(private el: ElementRef) {}

 

  @HostListener('mouseenter') onMouseEnter() {

    this.el.nativeElement.style.backgroundColor = 'yellow';

  }

 

  @HostListener('mouseleave') onMouseLeave() {

    this.el.nativeElement.style.backgroundColor = '';

  }

}

Экзаменационный билет №6

Теоретическая часть

  1. Что такое интерполяция в Angular? Приведите пример.
  2. Как работает двустороннее связывание ([(ngModel)])? Где его можно использовать?

Ответы на теоретическую часть:

  1. Интерполяция — вставка значений переменных в шаблон через {{ }}. Пример:

html

 

Copy

 

Download

 

 

Run

<p>Привет, {{ username }}!</p>

  1. [(ngModel)] — синтаксис "banana in a box" для двустороннего связывания (изменение в input сразу меняет переменную). Требует FormsModule. Пример:

html

 

Copy

 

Download

 

 

Run

<input [(ngModel)]="email">

Практическая часть
Создайте форму входа (login и password) с использованием ngModel. Добавьте кнопку, которая выводит введенные данные в консоль.

typescript

 

Copy

 

Download

// login.component.ts

import { Component } from '@angular/core';

 

@Component({

  selector: 'app-login',

  template: `

    <input [(ngModel)]="login" placeholder="Логин">

    <input [(ngModel)]="password" type="password" placeholder="Пароль">

    <button (click)="submit()">Войти</button>

  `,

})

export class LoginComponent {

  login: string = '';

  password: string = '';

 

  submit() {

    console.log('Логин:', this.login, 'Пароль:', this.password);

  }

}


Экзаменационный билет №7

Теоретическая часть

  1. Что такое Жизненный цикл компонента (Component Lifecycle)? Назовите 3 основных хука.
  2. Для чего нужен ngOnInit?

Ответы на теоретическую часть:

  1. Жизненный цикл — этапы от создания до уничтожения компонента. Основные хуки:
    • ngOnInit (инициализация),
    • ngOnChanges (изменение @Input),
    • ngOnDestroy (уничтожение).
  2. ngOnInit вызывается после первого ngOnChanges. Здесь рекомендуется загружать данные (например, API-запросы).

Практическая часть
Создайте компонент TimerComponent, который выводит текущее время и обновляет его каждую секунду. Используйте ngOnInit и ngOnDestroy.

typescript

 

Copy

 

Download

// timer.component.ts

import { Component, OnInit, OnDestroy } from '@angular/core';

import { interval, Subscription } from 'rxjs';

 

@Component({

  selector: 'app-timer',

  template: `<p>Текущее время: {{ currentTime }}</p>`,

})

export class TimerComponent implements OnInit, OnDestroy {

  currentTime: string = '';

  private subscription!: Subscription;

 

  ngOnInit() {

    this.subscription = interval(1000).subscribe(() => {

      this.currentTime = new Date().toLocaleTimeString();

    });

  }

 

  ngOnDestroy() {

    this.subscription.unsubscribe();

  }

}


Экзаменационный билет №8

Теоретическая часть

  1. Что такое Сервисы (Services) в Angular? Как их создать и использовать?
  2. Объясните, что такое Dependency Injection (DI).

Ответы на теоретическую часть:

  1. Сервисы — классы для хранения логики, данных или работы с API. Создаются через @Injectable(), регистрируются в providers (или providedIn: 'root').
  2. DI — механизм передачи зависимостей (например, сервисов) в компоненты через конструктор.

Практическая часть
Создайте сервис CounterService с методами increment() и getCount(). Используйте его в компоненте для отображения счетчика.

typescript

 

Copy

 

Download

// counter.service.ts

import { Injectable } from '@angular/core';

 

@Injectable({

  providedIn: 'root',

})

export class CounterService {

  private count = 0;

 

  increment() {

    this.count++;

  }

 

  getCount() {

    return this.count;

  }

}

 

// counter.component.ts

import { Component } from '@angular/core';

import { CounterService } from './counter.service';

 

@Component({

  selector: 'app-counter',

  template: `

    <p>Счетчик: {{ count }}</p>

    <button (click)="increment()">+1</button>

  `,

})

export class CounterComponent {

  count: number = 0;

 

  constructor(private counterService: CounterService) {}

 

  increment() {

    this.counterService.increment();

    this.count = this.counterService.getCount();

  }

}


Экзаменационный билет №9

Теоретическая часть

  1. Что такое Роутинг (Routing) в Angular? Как настроить базовый маршрут?
  2. Как программно перейти на другую страницу?

Ответы на теоретическую часть:

  1. Роутинг — навигация между компонентами. Настройка в app-routing.module.ts:

typescript

 

Copy

 

Download

const routes: Routes = [

  { path: '', component: HomeComponent }

];

  1. Через Router:

typescript

 

Copy

 

Download

this.router.navigate(['/path']);

Практическая часть
Создайте два компонента: HomeComponent и AboutComponent. Настройте роутинг между ними с ссылками <a routerLink="">.

typescript

 

Copy

 

Download

// app-routing.module.ts

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';

 

const routes: Routes = [

  { path: '', component: HomeComponent },

  { path: 'about', component: AboutComponent },

];

 

@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule],

})

export class AppRoutingModule {}

 

// app.component.html

<nav>

  <a routerLink="/">Главная</a>

  <a routerLink="/about">О нас</a>

</nav>

<router-outlet></router-outlet>


Экзаменационный билет №10

Теоретическая часть

  1. Что такое Pipes в Angular? Приведите 3 примера встроенных пайпов.
  2. Как создать собственный пайп?

Ответы на теоретическую часть:

  1. Pipes преобразуют данные прямо в шаблоне. Примеры:
    • {{ text | uppercase }},
    • {{ date | date:'dd.MM.yyyy' }},
    • {{ price | currency }}.
  2. Через @Pipe({ name: 'myPipe' }) и реализацию transform().

Практическая часть
Создайте пайп reverse, который переворачивает строку (например, "Angular" → "ralugnA").

typescript

 

Copy

 

Download

// reverse.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';

 

@Pipe({

  name: 'reverse',

})

export class ReversePipe implements PipeTransform {

  transform(value: string): string {

    return value.split('').reverse().join('');

  }

}

 

// Использование в шаблоне:

<p>{{ 'Angular' | reverse }}</p>  <!-- Выведет: ralugnA -->

Экзаменационный билет №11

Теоретическая часть

  1. Что такое декораторы в Angular? Перечислите основные декораторы и их назначение.
  2. Объясните разницу между реактивными (Reactive) и шаблонно-ориентированными (Template-driven) формами.

Ответы на теоретическую часть:

  1. Декораторы - это функции, добавляющие метаданные к классам. Основные декораторы:
    • @Component - определяет компонент
    • @Directive - определяет директиву
    • @Injectable - отмечает класс как сервис
    • @NgModule - определяет модуль
    • @Input и @Output - для взаимодействия между компонентами
  2. Реактивные формы:
    • Создаются программно в классе компонента
    • Более гибкие и тестируемые
    • Используют FormGroup, FormControl
    • Требуют ReactiveFormsModule

Шаблонно-ориентированные формы:

    • Создаются через директивы в шаблоне
    • Проще в использовании
    • Используют ngModel
    • Требуют FormsModule

Практическая часть
Создайте реактивную форму регистрации с полями:

  • email (обязательное, валидация email)
  • password (обязательное, минимум 6 символов)
  • confirmPassword (должен совпадать с password)

typescript

 

Copy

 

Download

// registration.component.ts

import { Component } from '@angular/core';

import { FormBuilder, Validators, AbstractControl } from '@angular/forms';

 

@Component({

  selector: 'app-registration',

  template: `

    <form [formGroup]="regForm" (ngSubmit)="onSubmit()">

      <input formControlName="email" placeholder="Email">

      <div *ngIf="regForm.get('email')?.invalid && regForm.get('email')?.touched">

        Введите корректный email

      </div>

 

      <input formControlName="password" type="password" placeholder="Пароль">

      <div *ngIf="regForm.get('password')?.invalid && regForm.get('password')?.touched">

        Пароль должен быть не менее 6 символов

      </div>

 

      <input formControlName="confirmPassword" type="password" placeholder="Подтвердите пароль">

      <div *ngIf="regForm.hasError('mismatch')">

        Пароли не совпадают

      </div>

 

      <button type="submit" [disabled]="regForm.invalid">Зарегистрироваться</button>

    </form>

  `

})

export class RegistrationComponent {

  regForm = this.fb.group({

    email: ['', [Validators.required, Validators.email]],

    password: ['', [Validators.required, Validators.minLength(6)]],

    confirmPassword: ['', Validators.required]

  }, { validator: this.passwordMatchValidator });

 

  constructor(private fb: FormBuilder) {}

 

  passwordMatchValidator(control: AbstractControl) {

    const password = control.get('password')?.value;

    const confirmPassword = control.get('confirmPassword')?.value;

    return password === confirmPassword ? null : { mismatch: true };

  }

 

  onSubmit() {

    console.log(this.regForm.value);

  }

}


Экзаменационный билет №12

Теоретическая часть

  1. Что такое Guard в Angular? Какие типы Guard вы знаете?
  2. Объясните назначение CanActivate и CanDeactivate.

Ответы на теоретическую часть:

  1. Guards - это интерфейсы для контроля доступа к маршрутам. Основные типы:
    • CanActivate - разрешает/запрещает доступ к маршруту
    • CanDeactivate - разрешает/запрещает уход с маршрута
    • CanLoad - разрешает/запрещает загрузку модуля
    • Resolve - предварительная загрузка данных перед активацией маршрута
  2. CanActivate:
    • Проверяет, может ли пользователь перейти на маршрут
    • Используется для защиты закрытых страниц (например, требующих авторизации)

CanDeactivate:

    • Проверяет, может ли пользователь покинуть маршрут
    • Используется для предотвращения потери данных (например, при заполнении формы)

Практическая часть
Создайте AuthGuard, который проверяет наличие токена в localStorage. Если токена нет - перенаправляет на страницу входа.

typescript

 

Copy

 

Download

// auth.guard.ts

import { Injectable } from '@angular/core';

import { CanActivate, Router } from '@angular/router';

 

@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}

 

  canActivate(): boolean {

    const token = localStorage.getItem('auth_token');

    if (!token) {

      this.router.navigate(['/login']);

      return false;

    }

    return true;

  }

}

 

// app-routing.module.ts

const routes: Routes = [

  {

    path: 'dashboard',

    component: DashboardComponent,

    canActivate: [AuthGuard]

  },

  { path: 'login', component: LoginComponent }

];


Экзаменационный билет №13

Теоретическая часть

  1. Что такое Interceptors в Angular? Для чего они используются?
  2. Приведите пример использования HTTP Interceptor.

Ответы на теоретическую часть:

  1. Interceptors - это middleware для HTTP-запросов/ответов. Позволяют:
    • Добавлять заголовки (например, Authorization)
    • Обрабатывать ошибки
    • Логировать запросы
    • Модифицировать запросы/ответы
    • Добавлять загрузчики
  2. Пример использования:
    • Добавление токена авторизации ко всем запросам
    • Обработка 401 ошибки (перенаправление на страницу входа)
    • Добавление заголовка Content-Type

Практическая часть
Создайте AuthInterceptor, который добавляет токен из localStorage ко всем исходящим запросам.

typescript

 

Copy

 

Download

// auth.interceptor.ts

import { Injectable } from '@angular/core';

import {

  HttpRequest,

  HttpHandler,

  HttpEvent,

  HttpInterceptor

} from '@angular/common/http';

import { Observable } from 'rxjs';

 

@Injectable()

export class AuthInterceptor implements HttpInterceptor {

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const token = localStorage.getItem('auth_token');

   

    if (token) {

      request = request.clone({

        setHeaders: {

          Authorization: `Bearer ${token}`

        }

      });

    }

   

    return next.handle(request);

  }

}

 

// app.module.ts

@NgModule({

  providers: [

    { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }

  ]

})


Экзаменационный билет №14

Теоретическая часть

  1. Что такое Content Projection в Angular? Как работает <ng-content>?
  2. Объясните разницу между <ng-content> и <ng-template>.

Ответы на теоретическую часть:

  1. Content Projection - это механизм вставки контента из родительского компонента в дочерний. <ng-content>:
    • Определяет место, куда будет вставлен контент
    • Поддерживает селекторы для выбора определенного контента
    • Не создает собственный scope (контент использует контекст родителя)
  2. Разница:
    • <ng-content>: простое встраивание готового контента
    • <ng-template>: шаблон, который можно многократно использовать и рендерить с разным контекстом

Практическая часть
Создайте компонент CardComponent с использованием <ng-content> для:

  • Заголовка (селектор [card-header])
  • Основного контента (по умолчанию)
  • Футера (селектор [card-footer])

typescript

 

Copy

 

Download

// card.component.ts

import { Component } from '@angular/core';

 

@Component({

  selector: 'app-card',

  template: `

    <div class="card">

      <div class="card-header">

        <ng-content select="[card-header]"></ng-content>

      </div>

      <div class="card-body">

        <ng-content></ng-content>

      </div>

      <div class="card-footer">

        <ng-content select="[card-footer]"></ng-content>

      </div>

    </div>

  `,

  styles: [`

    .card { border: 1px solid #ddd; padding: 16px; margin: 8px; }

    .card-header { font-weight: bold; margin-bottom: 8px; }

    .card-footer { margin-top: 8px; font-size: 0.8em; color: #666; }

  `]

})

export class CardComponent {}

 

// Использование:

<app-card>

  <div card-header>Заголовок карточки</div>

  Основное содержимое карточки

  <div card-footer>Футер карточки</div>

</app-card>


Экзаменационный билет №15

Теоретическая часть

  1. Что такое ViewChild и ViewChildren? В чем разница?
  2. Когда нужно использовать static: true в @ViewChild?

Ответы на теоретическую часть:

  1. ViewChild:
    • Получает ссылку на один дочерний элемент/компонент/директиву
    • Возвращает первый найденный элемент

ViewChildren:

    • Получает список всех дочерних элементов
    • Возвращает QueryList (можно подписаться на изменения)
  1. static: true нужно:
    • Когда элемент доступен до проверки изменений (например, *ngIf отсутствует)
    • Для элементов, которые никогда не меняются
    • В Angular 9+ по умолчанию static: false

Практическая часть
Создайте компонент с кнопкой и элементом div. Используя ViewChild, изменяйте цвет div при клике на кнопку.

typescript

 

Copy

 

Download

// color-changer.component.ts

import { Component, ViewChild, ElementRef } from '@angular/core';

 

@Component({

  selector: 'app-color-changer',

  template: `

    <button (click)="changeColor()">Изменить цвет</button>

    <div #colorBox style="width: 100px; height: 100px; background: lightgray; margin-top: 10px;"></div>

  `

})

export class ColorChangerComponent {

  @ViewChild('colorBox', { static: true }) colorBox!: ElementRef;

  colors = ['red', 'green', 'blue', 'yellow'];

  currentIndex = 0;

 

  changeColor() {

    this.currentIndex = (this.currentIndex + 1) % this.colors.length;

    this.colorBox.nativeElement.style.backgroundColor = this.colors[this.currentIndex];

  }

}

 

 

(1)Кейс: "Неправильное поведение формы авторизации — форма зависает при ошибке ввода"

Описание кейса

Вы — фронтенд-разработчик на начальном уровне курса Angular Developer. Вам поручено разработать форму авторизации для веб-приложения. Форма должна проверять введенные пользователем имя и пароль и отправлять их на сервер для проверки. Если данные введены неверно, форма должна показать сообщение об ошибке и разрешить повторное заполнение поля.

Однако при тестировании было замечено следующее поведение:

  • Когда пользователь вводит неправильные данные, страница зависает и форма становится неактивной.
  • Пользователь не может повторно ввести правильные данные.
  • Сообщение об ошибке появляется некорректно.

Исходный компонент FormComponent.ts

import { Component } from '@angular/core';

import { NgForm } from '@angular/forms';

 

@Component({

  selector: 'app-form',

  templateUrl: './form.component.html',

  styleUrls: ['./form.component.css']

})

export class FormComponent {

  loginErrorMessage: string | null = null;

 

  onSubmit(form: NgForm): void {

    const userData = form.value;

    this.login(userData.username, userData.password);

  }

 

  async login(username: string, password: string): Promise<void> {

    try {

      await fetch('/api/login', {

        method: 'POST',

        headers: {

          'Content-Type': 'application/json'

        },

        body: JSON.stringify({ username, password })

      });

      console.log('Login successful');

    } catch (err) {

      this.loginErrorMessage = 'Ошибка входа! Проверьте имя пользователя и пароль.';

      throw err;

    }

  }

}

HTML-шаблон компонента (form.component.html)

<div class="container">

  <h2>Авторизация</h2>

  <ng-container *ngIf="loginErrorMessage">

    {{ loginErrorMessage }}

  </ng-container>

  <form #form="ngForm" (ngSubmit)="onSubmit(form)" novalidate>

    <div class="mb-3">

      <label for="username">Имя пользователя:</label>

      <input type="text" id="username" name="username" ngModel required />

    </div>

    <div class="mb-3">

      <label for="password">Пароль:</label>

      <input type="password" id="password" name="password" ngModel required />

    </div>

    <button type="submit" class="btn btn-primary">Войти</button>

  </form>

</div>


Анализ ситуации и выявление проблем

Проблема №1: Формирование зависания страницы при ошибкеПричины:При возникновении ошибки во время отправки данных форма блокируется, поскольку обработчик login() бросает исключение, останавливающее дальнейшую работу приложения.

Решение:Необходимо обработать ошибку асинхронно и предотвратить остановку программы. Для этого исключите использование throw внутри асинхронного метода и установите флаг ошибки корректно.

Проблема №2: Неправильная обработка ошибок сервераПричины:Форма показывает общее сообщение об ошибке ("Проверьте имя пользователя и пароль") независимо от типа ошибки.

Решение:Добавьте обработку различных типов ошибок сервера (например, неправильного имени пользователя или пароля), чтобы давать конкретные рекомендации пользователям.

Проблема №3: Отображение уведомления об ошибке некорректноПричины:Сообщение об ошибке показывается сразу же после первой неудачной попытки. Однако оно остается видимым даже после повторного заполнения формы. Это создает путаницу у пользователей.

Решение:Скрывайте уведомление об ошибке автоматически при каждом новом действии пользователя (при клике на поле или попытке отправить новую попытку).

Проблема №4: Недостаточная проверка данных на стороне клиентаПричины:Перед отправкой формы проверяется лишь наличие значений полей, однако отсутствует дополнительная логика проверки формата или валидности данных (например, длина пароля).

Решение:Добавьте предварительную клиентскую проверку форматов (регулярными выражениями) и длины пароля прямо в форме.


Итоговый исправленный компонент FormComponent.ts

import { Component } from '@angular/core';

import { NgForm } from '@angular/forms';

 

@Component({

  selector: 'app-form',

  templateUrl: './form.component.html',

  styleUrls: ['./form.component.css']

})

export class FormComponent {

  loginErrorMessage: string | null = null;

 

  constructor() {}

 

  clearErrors(): void {

    this.loginErrorMessage = null;

  }

 

  onSubmit(form: NgForm): void {

    this.clearErrors(); // Скрытие предыдущего сообщения об ошибке

    const userData = form.value;

    this.login(userData.username, userData.password);

  }

 

  async login(username: string, password: string): Promise<void> {

    try {

      const response = await fetch('/api/login', {

        method: 'POST',

        headers: {

          'Content-Type': 'application/json'

        },

        body: JSON.stringify({ username, password })

      });

 

      if (!response.ok) {

        const errorResponse = await response.json();

        switch (errorResponse.errorCode) {

          case 'invalid_credentials':

            this.loginErrorMessage = 'Неверное имя пользователя или пароль!';

            break;

          default:

            this.loginErrorMessage = 'Ошибка входа! Попробуйте позже.';

        }

      } else {

        console.log('Login successful');

      }

    } catch (err) {

      this.loginErrorMessage = 'Ошибка подключения к серверу. Повторите попытку позже.';

    }

  }

}

Улучшенный шаблон (form.component.html)

<div class="container">

  <h2>Авторизация</h2>

  <ng-container *ngIf="loginErrorMessage">

    <p class="alert alert-danger">{{ loginErrorMessage }}</p>

  </ng-container>

  <form #form="ngForm" (ngSubmit)="onSubmit(form)" novalidate>

    <div class="mb-3">

      <label for="username">Имя пользователя:</label>

      <input type="text" id="username" name="username" [(ngModel)]="username" pattern="^[a-zA-Z0-9]+$" title="Допускаются только буквы и цифры." required />

    </div>

    <div class="mb-3">

      <label for="password">Пароль:</label>

      <input type="password" id="password" name="password" [(ngModel)]="password" minlength="8" maxlength="32" required />

    </div>

    <button type="submit" class="btn btn-primary">Войти</button>

  </form>

</div>


Обучающие моменты

Что изучают студенты

Примечание

Работа с формами

Как обрабатывать события формы и валидировать данные

Асинхронность

Использование асинхронных методов и обработки результатов

Валидаторы

Применение регулярных выражений и ограничений на длину

Уведомления

Управление отображением уведомлений о статусе операции

Логика взаимодействия

Разделение ролей компонентов (отправка данных vs обработка результата)

Клиентская оптимизация

Проверка форматов данных до отправки на сервер


Дополнительные задания для самостоятельной работы

  1. Реализовать дополнительную защиту от частых попыток входа путем добавления таймера задержки после каждой неудачной попытки.
  2. Добавить возможность восстановления пароля с использованием Angular Router.
  3. Использовать реактивные формы (Reactive Forms) вместо шаблонированных форм (Template-driven forms).
  4. Настройте аутентификацию на стороне сервера с выдачей JWT-токенов и сохраняйте токены в localStorage.

(2)Кейс: "Карточка товара выводит пустые значения"

Описание ситуации

Вы — начинающий frontend-разработчик, работающий над проектом интернет-магазина, основанного на Angular. Вам поручено создать карточку товара, которая должна выводить название продукта, цену и описание. Но при попытке отобразить данные, карточка остаётся пустой, хотя товары загружены в сервис и рендерятся в приложении.

Необходимо разобраться, почему данные не передаются на экран и исправить проблему.


Исходные данные

Компонент ProductCardComponent (карточка товара)

Код файла product-card.component.ts

import { Component, Input } from '@angular/core';

 

@Component({

  selector: 'app-product-card',

  templateUrl: './product-card.component.html'

})

export class ProductCardComponent {

  @Input() productName: string | undefined;

  @Input() price: number | undefined;

  @Input() description: string | undefined;

}

Код шаблона product-card.component.html

<div class="card">

  <h2>{{ productName }}</h2>

  <p>Цена: {{ price }}$</p>

  <p>Описание: {{ description }}</p>

</div>

Родительский компонент ProductsListComponent (список товаров)

Код файла products-list.component.ts

import { Component } from '@angular/core';

 

@Component({

  selector: 'app-products-list',

  templateUrl: './products-list.component.html'

})

export class ProductsListComponent {

  products = [

    { id: 1, name: 'Кофеварка', price: 199, description: 'Хороший кофе каждый день' },

    { id: 2, name: 'Смартфон', price: 599, description: 'Высокоскоростной процессор' },

    // Другие продукты...

  ];

}

Шаблон списка продуктов products-list.component.html

<div class="list-container">

  <app-product-card *ngFor="let product of products" [productName]="product.name" [price]="product.price" [description]="product.description" >

  </app-product-card>

</div>


Анализ проблемы и выявления причин

  1. Неправильная передача данных:Возможно, свойства передавались неправильно или вовсе не были переданы. Проверьте синтаксис передачи входных данных в компонент ProductCardComponent.
  2. Типизация и неопределённые значения:Свойства типа string | undefined или number | undefined позволяют иметь значение undefined, и если оно именно такое, информация не появится на странице.
  3. Использование ngIf:Можно добавлять условие вывода содержимого карточки, если товар успешно передан.
  4. Логирование значений:Для проверки текущих значений можно вывести их в консоль внутри конструктора или методов жизненного цикла компонента.

Решение

Шаг 1: Добавляем проверку инициализации значений во входе компонента ProductCardComponent:

// product-card.component.ts

constructor() {

  console.log('Product Card received:', this.productName, this.price, this.description); // Логируем значения

}

Шаг 2: Проверяем наличие данных перед выводом в шаблон:

<!-- product-card.component.html -->

<div class="card" *ngIf="productName && price && description">

  <h2>{{ productName }}</h2>

  <p>Цена: {{ price }}$</p>

  <p>Описание: {{ description }}</p>

</div>

Шаг 3: Используем pipe safe navigation operator (?.) для предотвращения ошибочного вывода:

<div class="card">

  <h2>{{ productName ?? 'Название отсутствует' }}</h2>

  <p>Цена: {{ price ?? 'Цена неизвестна' }}$</p>

  <p>Описание: {{ description ?? 'Описание отсутствует' }}</p>

</div>

Шаг 4: Добавляем <pre> тег для просмотра JSON структуры каждого элемента в списке продуктов:

<!-- products-list.component.html -->

<div class="list-container">

  <pre>{{ products | json }}</pre>

  <!-- Остальной код... -->

</div>


Обучающий момент

Студенты закрепляют такие темы:

  • Передача данных между компонентами Angular через @Input() декораторы.
  • Типизация данных и обработка неопределённых значений.
  • Использование условных операторов и pipes для безопасного вывода данных.
  • Методы отладки и анализа состояния компонентов через логирование.

Дополнительные задания для самостоятельного изучения

  1. Сделайте так, чтобы карточки товаров появлялись плавно (например, с эффектом fade-in).
  2. Создайте фильтрующий механизм для выбора категорий товаров.
  3. Добавьте корзину покупок, куда пользователи смогут добавлять выбранные товары.
  4. Подключите внешний API (например, fakestoreapi.com), чтобы получать реальные данные о продуктах.

 

Ролевая игра №1: "Стартап-студия Angular"

Цель игры

Познакомить студентов с ключевыми этапами создания простого одностраничного приложения (SPA) на Angular — от идеи до базовой реализации.
Имитировать командную разработку, развить навыки распределения задач, коммуникации и решения типовых фронтенд-проблем.

 


Формат

  • Тип: Образовательная ролевая игра (настольная / онлайн)
  • Участники: 4–6 человек
  • Продолжительность: 3–4 академических часа
  • Материалы: доска, стикеры, карточки ролей, описание задания, шаблон проекта Angular (например, через StackBlitz или локальный CLI)

 


Сеттинг

Вы — молодая IT-стартап-компания, специализирующаяся на создании веб-приложений. Вам поступил заказ на разработку прототипа SPA для управления списком задач (To-do List). Заказчик хочет увидеть минимально жизнеспособный продукт, который будет работать в браузере и позволять добавлять, удалять и отмечать задачи выполненными.

 

У вас ограниченное время, но есть доступ к Angular CLI, TypeScript и всем необходимым инструментам.

 


Роли в команде

Каждый участник получает роль, связанную с фронтенд-разработкой:

 

Роль

Описание

Product Owner

Определяет цели, требования и приоритеты. Утверждает результаты. Ведёт общение с заказчиком.

Frontend-разработчик

Пишет основную логику компонентов, работает с данными, реализует бизнес-логику.

UI/UX-дизайнер

Создаёт макеты интерфейса, подбирает цвета, стили, обеспечивает удобство использования.

HTML-верстальщик

Отвечает за верстку, взаимодействует с дизайнером, применяет стили, использует директивы и шаблоны.

Тестировщик QA

Проверяет работу функционала, пишет чек-листы, сообщает о найденных ошибках.

DevOps / Технический менеджер (по желанию)

Отвечает за сборку, запуск, деплой, помогает в настройке окружения и решении технических вопросов.

 


Этапы игры

Этап 1: Идея и планирование (30 мин)

  • Product Owner представляет концепцию: «Система управления задачами».
  • Команда обсуждает, какие функции будут в MVP:
    • Добавление задач
    • Удаление задач
    • Отметка выполненных задач
    • Сохранение состояния (локальное хранение)
  • Менеджер составляет список задач и распределяет их между ролями.

 

Этап 2: Разработка (90–120 мин)

  • Frontend-разработчик создаёт компоненты, сервисы, настраивает привязку данных.
  • Верстальщик реализует HTML/CSS интерфейс, применяет *ngFor, кнопки, формы.
  • UI/UX-дизайнер предлагает макеты, цветовые решения, помогает с анимацией и стилями.
  • QA проверяет каждую функцию, записывает найденные проблемы.
  • DevOps помогает с запуском проекта, настройкой Angular CLI, если нужно.

 

Этап 3: Тестирование и доработка (30 мин)

  • QA проводит финальное тестирование.
  • Разработчики исправляют найденные ошибки.
  • Дизайнер может доработать интерфейс.

 

Этап 4: Презентация продукта (30 мин)

  • Каждый участник рассказывает, что он делал.
  • Product Owner демонстрирует готовое приложение.
  • Все вместе обсуждают, что получилось, что можно улучшить.

 


Пример задачи

Задача: Реализовать интерфейс To-Do List с возможностью:

  • Добавления новой задачи
  • Удаления задачи
  • Отметки как выполненной (через checkbox)
  • Отображения количества активных задач
  • Хранения задач в localStorage (опционально)

 


Обучающие моменты

Что изучают студенты

Примечание

Базовая структура Angular-приложения

Компоненты, модули, шаблоны

Работа с данными и событиями

@Input(), @Output(), EventEmitter

Шаблонизация и директивы

*ngFor, *ngIf, [(ngModel)]

Сервисы и инъекция зависимостей

Для централизованного управления данными

Жизненный цикл компонента

ngOnInit, ngOnDestroy

Работа в команде

Распределение задач, коммуникация, презентация результата

 


Дополнительные задания (по желанию)

  1. Добавьте фильтрацию задач: все / активные / выполненные.
  2. Реализуйте сохранение задач в localStorage.
  3. Сделайте возможность редактирования задачи.
  4. Добавьте пагинацию или поиск.
  5. Подключите внешнее API (например JSONPlaceholder) вместо локального массива.

 


Если хочешь — могу подготовить PDF-версию этой ролевой игры с карточками ролей, чек-листами и шаблоном проекта.
А также продолжить серию и сделать следующие игры, например:

  • На тему форм и валидации
  • На маршрутизацию и lazy loading
  • На работу с HTTP и API
  • На создание кастомных директив и пайпов

Ролевая игра №2: "Angular-стартап. Создание интернет-магазина"

Цель игры

Познакомить студентов с созданием SPA-интерфейса интернет-магазина на Angular. Научить использовать компоненты, сервисы, маршрутизацию и работу с API.

 


Формат

  • Тип: Образовательная ролевая игра (настольная / онлайн)
  • Участники: 4–6 человек
  • Продолжительность: 3–4 академических часа
  • Материалы: доска, стикеры, карточки ролей, описание задания, шаблон Angular-проекта

 


Сеттинг

Вы — команда фронтенд-разработчиков, нанятых для создания MVP интернет-магазина. Заказчик хочет увидеть рабочий интерфейс каталога товаров, страницу товара и корзину. Времени мало, но есть доступ к Angular и публичному API.

 


Роли в команде

Роль

Описание

Product Owner

Определяет приоритеты, согласовывает реализацию, представляет интересы заказчика

Frontend-разработчик

Пишет логику компонентов, работает с данными, реализует маршруты

UI/UX-дизайнер

Создаёт макеты, подбирает цвета, обеспечивает удобство использования

Верстальщик

Отвечает за HTML/CSS, использует директивы, привязывает данные

QA-тестировщик

Проверяет функционал, пишет чек-листы, сообщает о найденных ошибках

DevOps / Технический менеджер (по желанию)

Настраивает сборку, помогает с запуском и деплоем

 


Этапы игры

Этап 1: Идея и планирование (30 мин)

  • Product Owner представляет концепцию: «Интернет-магазин с товарами».
  • Команда обсуждает, какие функции будут в MVP:
    • Каталог товаров
    • Детальная страница товара
    • Корзина
  • Распределение задач между ролями.

 

Этап 2: Разработка (90–120 мин)

  • Разработчик создаёт компоненты, настраивает маршруты (RouterModule).
  • Верстальщик делает интерфейс: карточки товаров, кнопки, формы.
  • UI/UX-дизайнер предлагает макеты и цветовые решения.
  • QA проверяет каждую функцию, записывает найденные проблемы.
  • DevOps помогает с запуском проекта через Angular CLI или StackBlitz.

 

Этап 3: Тестирование и доработка (30 мин)

  • QA проводит финальное тестирование.
  • Разработчики исправляют ошибки.
  • Дизайнер может доработать внешний вид.

 

Этап 4: Презентация продукта (30 мин)

  • Каждый участник рассказывает, что он делал.
  • Product Owner демонстрирует готовое приложение.
  • Все вместе обсуждают, что получилось, что можно улучшить.

 


Пример задачи

Создайте SPA интернет-магазина со следующим функционалом:

  • Главная страница с товарами (используйте *ngFor)
  • Детальная страница товара по маршруту /product/:id
  • Корзина с возможностью добавления и удаления товаров
  • Используйте сервис для получения данных (например, JSONPlaceholder)

 


Обучающие моменты

Что изучают студенты

Примечание

Маршрутизация в Angular

RouterModule, параметры маршрутов

Работа с API

HttpClient, Observable

Сервисы и инъекция зависимостей

Для централизованного управления данными

Компоненты и шаблоны

Структура приложения, связь между компонентами

Работа в команде

Распределение задач, презентация, общение

 


Дополнительные задания (по желанию)

  1. Добавьте фильтр по категориям.
  2. Реализуйте поиск товаров.
  3. Подключите реальное API (например, fakestoreapi.org).
  4. Сделайте возможность изменения количества товара в корзине.
  5. Добавьте анимации перехода между страницами.

 


Ролевая игра №3: "Angular-эксперимент. Формы и валидация"

Цель игры

Научить студентов работать с формами в Angular: шаблонные и реактивные, валидация, обработка событий, вывод ошибок.

 


Формат

  • Тип: Образовательная ролевая игра
  • Участники: 4–6 человек
  • Продолжительность: 2–3 академических часа
  • Материалы: доска, стикеры, карточки ролей, описание задания, шаблон Angular-формы

 


Сеттинг

Вы — команда разработчиков, которой нужно быстро подготовить форму регистрации для клиентского сайта. Форма должна быть безопасной, с валидацией полей и удобным UX. У вас ограниченное время, но есть Angular и TypeScript.

 


Роли в команде

Роль

Описание

Product Owner

Определяет требования к форме, контролирует выполнение

Разработчик форм

Пишет скрипты, использует FormBuilder, FormGroup

UI/UX-дизайнер

Создаёт дизайн формы, помогает с расположением элементов

Верстальщик

Делает HTML-структуру, применяет стили, директивы

QA-тестировщик

Проверяет валидацию, правильность работы формы

Технический специалист (по желанию)

Помогает с Angular CLI, настройкой окружения

 


Этапы игры

Этап 1: Постановка задачи (20 мин)

  • Product Owner описывает: «Форма регистрации с полями: имя, email, пароль, повтор пароля».
  • Команда выбирает тип формы (шаблонная или реактивная), распределяет роли.

 

Этап 2: Разработка (60–90 мин)

  • Разработчик создаёт форму, реализует валидацию (required, email, minLength и т.д.).
  • Верстальщик делает интерфейс, отображает ошибки.
  • QA проверяет поведение формы при разных вводах.
  • Дизайнер помогает с оформлением.

 

Этап 3: Тестирование и доработка (20 мин)

  • QA проверяет все поля, отправляет форму с разными значениями.
  • Разработчики исправляют найденные ошибки.

 

Этап 4: Презентация (20 мин)

  • Product Owner показывает форму.
  • QA рассказывает о найденных проблемах.
  • Команда обсуждает, что можно улучшить.

 


Пример задачи

Создайте форму регистрации с такими полями:

  • Имя (обязательное)
  • Email (валидный формат)
  • Пароль (минимум 6 символов)
  • Повтор пароля (должен совпадать с первым)
  • Отображение ошибок под полями
  • Возможность отправки формы с выводом данных в консоль

 


Обучающие моменты

Что изучают студенты

Примечание

Шаблонные и реактивные формы

Разница между подходами

FormBuilder и FormGroup

Создание форм программно

Валидация

required, pattern, minlength, сравнение значений

Работа с событиями

submit, change, blur

Отладка и тестирование

Проверка граничных случаев

 


Дополнительные задания (по желанию)

  1. Добавьте кастомный валидатор для телефона.
  2. Сделайте сохранение введённых данных в localStorage.
  3. Реализуйте динамическое добавление полей (например, несколько телефонов).
  4. Сделайте переключатель между регистрацией и входом.
  5. Подключите Material Design или Bootstrap для стилей.

 


Ролевая игра №4: "Angular-лаборатория. Пользовательские директивы и пайпы"

Цель игры

Научить студентов создавать собственные директивы и пайпы в Angular. Понять их назначение и применение в реальных задачах.

 


Формат

  • Тип: Образовательная ролевая игра
  • Участники: 4–6 человек
  • Продолжительность: 2–3 академических часа
  • Материалы: доска, стикеры, карточки ролей, описание задания, шаблон Angular-проекта

 


Сеттинг

Вы — исследователи в Angular-лаборатории. Вам поручено разработать библиотеку кастомных директив и пайпов для внутреннего использования. У вас нет времени на большие проекты, только эксперименты и быстрая реализация.

 


Роли в команде

Роль

Описание

Руководитель проекта

Определяет задачи, следит за сроками

Разработчик директив

Создаёт пользовательские атрибутные и структурные директивы

Разработчик пайпов

Пишет кастомные пайпы для преобразования данных

UI/UX-дизайнер

Предлагает идеи для визуального применения директив

QA-тестировщик

Проверяет работу директив и пайпов

Технический специалист (по желанию)

Помогает с настройкой модулей, импортом

 


Этапы игры

Этап 1: Постановка задачи (20 мин)

  • Руководитель даёт задание: «Создать 2 директивы и 2 пайпа для внутреннего использования».
  • Команда обсуждает идеи и распределяет роли.

 

Этап 2: Разработка (60–90 мин)

  • Разработчики пишут код директив и пайпов.
  • QA проверяет работу каждого элемента.
  • Дизайнер предлагает примеры использования в интерфейсе.

 

Этап 3: Тестирование и доработка (20 мин)

  • QA проверяет каждый элемент.
  • Разработчики исправляют ошибки.

 

Этап 4: Презентация (20 мин)

  • Каждый участник рассказывает о своей части.
  • Демонстрация работы директив и пайпов.
  • Обсуждение возможностей дальнейшего развития.

 


Пример задачи

Создайте следующие элементы:

  • Атрибутная директива HighlightDirective — выделяет текст при наведении
  • Структурная директива UnlessDirective — отображает контент, если условие ложно
  • Пайп ShortenPipe — обрезает текст до N символов
  • Пайп CurrencySymbolPipe — добавляет символ валюты к числу

 


Обучающие моменты

Что изучают студенты

Примечание

Директивы в Angular

Атрибутные и структурные

Создание пайпов

Преобразование данных в шаблоне

Декораторы @Directive и @Pipe

Как писать свои директивы и пайпы

Применение в интерфейсе

Как использовать в HTML

Работа в команде

Совместная разработка и тестирование

 


Дополнительные задания (по желанию)

  1. Реализуйте директиву для ограничения ввода только числами.
  2. Сделайте пайп для форматирования даты в удобный формат.
  3. Создайте директиву для анимации появления элемента.
  4. Добавьте кастомный пайп для фильтрации массива.
  5. Сделайте документацию по созданной библиотеке.

Кейс: "Задержка загрузки данных — пользователи ждут дольше минуты"

Описание кейса

Вы — начинающий фронтенд-разработчик на курсе Angular Developer. Ваша задача — создать страницу профиля пользователя, где выводится персональная информация (фото, имя, должность и контактные данные). Данные загружаются с удаленного API, и ваша цель — обеспечить быстрое получение и отображение информации на странице.

Однако в процессе тестирования выяснилось, что:

  • Загрузка данных занимает больше одной минуты.
  • Пока данные загружаются, экран пустой, что вызывает дискомфорт у пользователей.
  • После долгого ожидания либо появляются неполные данные, либо вообще ничего не отображается.

Исходный компонент ProfileComponent.ts

import { Component, OnInit } from '@angular/core';

import { HttpClient } from '@angular/common/http';

 

@Component({

  selector: 'app-profile',

  templateUrl: './profile.component.html',

  styleUrls: ['./profile.component.css'],

})

export class ProfileComponent implements OnInit {

  profileInfo: any | undefined;

 

  constructor(private http: HttpClient) {}

 

  ngOnInit(): void {

    this.fetchProfileData();

  }

 

  fetchProfileData(): void {

    this.http.get('/api/profile').subscribe((data) => {

      this.profileInfo = data;

    });

  }

}

Шаблон компонента (profile.component.html)

<div class="container">

  <img src="{{ profileInfo?.photo || '/assets/default-user.png' }}" alt="User Photo"/>

  <h2>{{ profileInfo?.name || 'Unknown User'}}</h2>

  <p><strong>Должность:</strong> {{ profileInfo?.position || 'не указана' }}</p>

  <p><strong>Контактные данные:</strong> {{ profileInfo?.contact || 'нет контактов' }}</p>

</div>


Анализ ситуации и выявление проблем

Проблема №1: Задержка загрузки данныхПричины:Данные загружаются медленно, возможно, из-за плохого соединения с сервером или большого объема передаваемых данных. Без обратной связи для пользователя создается впечатление "зависания".

Решение:Добавьте загрузочный индикатор («spinner») и временное содержимое (placeholder), пока идет ожидание реальных данных.

Проблема №2: Длительное отсутствие визуальной активностиПричины:Пока данные грузятся, пользователь видит пустую страницу, что воспринимается негативно.

Решение:Используйте механизм предварительной загрузки (preloading) и placeholder-контент, чтобы уменьшить восприятие задержек.

Проблема №3: Нехватка обработки возможных ошибокПричины:При сбоях сети или внутренних проблемах на сервере приложение продолжает ждать неопределенно долго.

Решение:Настройте таймаут запросов и обработчики ошибок, которые сообщат пользователю о возникших проблемах.

Проблема №4: Плохая производительность интерфейсаПричины:Если объем данных большой, интерфейс также замедляется при обработке данных.

Решение:Оптимизируйте компоненты и используйте методы кеширования данных на стороне клиента.


Итоговый исправленный компонент ProfileComponent.ts

import { Component, OnInit } from '@angular/core';

import { HttpClient } from '@angular/common/http';

import { Observable, of, timer } from 'rxjs';

import { mergeMap, takeUntil } from 'rxjs/operators';

 

@Component({

  selector: 'app-profile',

  templateUrl: './profile.component.html',

  styleUrls: ['./profile.component.css'],

})

export class ProfileComponent implements OnInit {

  profileInfo: any | undefined;

  loading: boolean = true;

  errorMessage: string | null = null;

 

  constructor(private http: HttpClient) {}

 

  ngOnInit(): void {

    this.fetchProfileData();

  }

 

  fetchProfileData(): void {

    const timeout = timer(30000); // Таймаут 30 секунд

    this.loading = true;

 

    this.http.get('/api/profile')

      .pipe(

        takeUntil(timeout),

        mergeMap(response => {

          if (response.status === 'ok') {

            return of(response.data);

          } else {

            throw new Error(response.message);

          }

        }),

        takeUntil(timer(30000)) // Общее ограничение на запрос

      )

      .subscribe(

        (data) => {

          this.profileInfo = data;

          this.loading = false;

        },

        (error) => {

          this.errorMessage = 'Возникла ошибка при получении данных.';

          this.loading = false;

        }

      );

  }

}

Улучшенный шаблон компонента (profile.component.html)

<div class="container">

  <div *ngIf="loading" class="loader"></div>

  <div *ngIf="!loading && !errorMessage">

    <img src="{{ profileInfo?.photo || '/assets/default-user.png' }}" alt="User Photo"/>

    <h2>{{ profileInfo?.name || 'Unknown User'}}</h2>

    <p><strong>Должность:</strong> {{ profileInfo?.position || 'не указана' }}</p>

    <p><strong>Контактные данные:</strong> {{ profileInfo?.contact || 'нет контактов' }}</p>

  </div>

  <div *ngIf="errorMessage" class="alert alert-danger">

    {{ errorMessage }}

  </div>

</div>


Обучающие моменты

Что изучают студенты

Примечание

RxJS

Работа с observable потоками и оператором takeUntil

Placeholder контент

Показ временного содержимого до полной загрузки

Таймеры

Ограничение длительности операций

Кеширование

Оптимизация производительности

Обработка ошибок

Предоставление обратной связи при неудаче

Интерфейсы и анимация

Создание интерактивных элементов и индикаторов загрузки


Дополнительные задания для самостоятельной работы

  1. Добавьте поддержку пагинации данных профиля (если они большие) с помощью lazy load.
  2. Создайте модуль для поддержки международного текста (i18n) на странице профиля.
  3. Интегрируйте WebSocket для реального времени обновления данных профиля.
  4. Добавьте анимационные эффекты при появлении и исчезновении элементов страницы.

 

Интеллект-карта 1: Общая структура курса

Центральный узел:

Фронтенд-разработчик Angular (Junior)

Основные ветки:

1. Основы веб-разработки

  • HTML / CSS
  • JavaScript (базовый уровень)
  • Работа с DOM
  • DevTools

2. TypeScript

  • Типизация
  • Классы и интерфейсы
  • Декораторы
  • Модули

3. Введение в Angular

  • Что такое SPA
  • Архитектура Angular
  • Angular CLI
  • Компоненты и модули

4. Компоненты и шаблоны

  • Привязка данных
  • *ngIf, *ngFor
  • @Input(), @Output()
  • Пайпы

5. Сервисы и DI

  • Создание сервисов
  • Инъекция зависимостей
  • providedIn

6. Формы

  • Шаблонные формы
  • Реактивные формы
  • Валидация

7. HTTP и API

  • HttpClient
  • GET / POST запросы
  • Observable
  • async pipe

8. Маршрутизация

  • RouterModule
  • Параметры маршрутов
  • lazy loading

9. Проектная работа

  • Создание SPA
  • Версионный контроль (Git)
  • Деплой
  • Презентация проекта

10. Дополнительно

  • RxJS (базовые понятия)
  • Git / GitHub
  • Подготовка портфолио
  • Советы по трудоустройству

Интеллект-карта 2: Формы и валидация

Центральный узел:

Формы и валидация в Angular

Основные ветки:

1. Виды форм

  • Шаблонные формы
  • Реактивные формы

2. Элементы форм

  • input, select, textarea
  • checkbox, radio
  • label и id

3. Привязка данных

  • [(ngModel]
  • [formControl]
  • name и #templateRef

4. ReactiveFormsModule

  • FormGroup
  • FormControl
  • FormBuilder

5. FormsModule

  • ngForm
  • ngModelGroup
  • Обработка событий

6. Валидация

  • required, minlength, maxlength
  • pattern
  • customValidators
  • Отображение ошибок

7. События форм

  • (ngSubmit)
  • valueChanges
  • statusChanges

8. Практическая задача

  • Форма регистрации
  • Форма входа
  • Форма обратной связи

Интеллект-карта 3: Маршрутизация и SPA

Центральный узел:

Маршрутизация и создание SPA

Основные ветки:

1. Основы маршрутизации

  • Что такое SPA
  • RouterModule
  • routerLink

2. Настройка маршрутов

  • Routes
  • path, component
  • pathMatch: 'full'

3. RouterOutlet

  • Понятие
  • Использование
  • Несколько outlet (по желанию)

4. Параметры маршрутов

  • :id
  • ActivatedRoute.snapshot.params
  • subscribe() на params

5. Динамические маршруты

  • Передача данных через маршруты
  • resolve guard

6. Защитники маршрутов

  • canActivate
  • canDeactivate
  • canLoad (для lazy loading)

7. Lazy loading модулей

  • Что это
  • Как подключить
  • Преимущества

8. Программная навигация

  • Router.navigate()
  • RouterLinkActive
  • queryParams и fragment

Интеллект-карта 4: HTTP и работа с API

Центральный узел:

HTTP и взаимодействие с API

Основные ветки:

1. HttpClient

  • Импорт HttpClientModule
  • GET, POST, PUT, DELETE
  • Заголовки и параметры запросов

2. Observable и RxJS

  • Что такое Observable
  • subscribe()
  • map, catchError
  • tap

3. Работа с данными

  • JSON.parse / JSON.stringify
  • Интерфейсы и модели
  • async pipe в шаблоне

4. Обработка ошибок

  • try/catch
  • throwError
  • retry()

5. Interceptor

  • Что это
  • Как использовать
  • Логирование и заголовки

6. REST API

  • Что такое REST
  • GET — получение данных
  • POST — отправка данных
  • Авторизация и токены

7. Практические примеры

  • Получение списка пользователей
  • Отправка формы на сервер
  • Поиск и фильтрация через API

Как использовать эти ментальные карты:

  • На занятиях: как вводная часть перед началом модуля.
  • Для самоподготовки: студент может распечатать или сохранить в виде схемы и использовать как чек-лист.
  • В командной работе: как основа для распределения задач.
  • Для преподавателя: как шаблон для создания визуального контента в формате PDF, Canva, XMind, MindMaster и др.

 

1. Учебное пособие

Название: Разработка веб-приложений на Angular: с нуля до первого проекта
Автор: Дмитрий Александреску
Год издания: 2022
Краткое описание:
Практическое руководство для начинающих фронтенд-разработчиков. В книге подробно рассматриваются основы TypeScript, архитектура Angular, работа с компонентами, сервисами, формами и маршрутизацией. Содержит примеры кода, упражнения и пошаговый проект.

 

2. Методические рекомендации

Название: Методика преподавания курса «Angular для начинающих»
Автор: Федеральный центр развития профессионального образования
Год издания: 2023
Краткое описание:
Методическое пособие для преподавателей, обучающих студентов разработке SPA на Angular. Содержит рекомендации по построению занятий, организации лабораторных работ, использованию интерактивных методик и оценке результатов обучения.

 

3. Задачник

Название: Практикум по Angular: задачи, упражнения и решения
Автор: Петров А.С., Кузнецов Н.Л.
Год издания: 2021
Краткое описание:
Сборник практических заданий по работе с Angular CLI, созданию компонентов, сервисов, форм, маршрутов и HTTP-запросов. Включает задания разного уровня сложности и эталонные реализации решений.

 

4. Хрестоматия

Название: Чтения по фронтенд-разработке: эссе, статьи и интервью от экспертов
Составитель: Алексей Головань
Год издания: 2020
Краткое описание:
Подборка текстов от известных фронтенд-разработчиков, блоггеров и специалистов из сообщества Angular. Темы: подходы к проектированию приложений, история становления фреймворков, советы по оптимизации и масштабированию.

 

5. Научная литература

Название: Современные технологии фронтенд-разработки: теория и практика
Автор: Ричард Стоун
Год издания: 2022
Краткое описание:
Научное издание, посвящённое современным технологиям создания веб-интерфейсов. Включает теоретические основы SPA, сравнение популярных фреймворков, архитектурные паттерны, работу с состоянием и асинхронностью. Полезен как справочник и база знаний.

 

 

  1. Angular для новичков: от HTML до SPA Изучите основы фронтенда, TypeScript и создайте своё первое одностраничное приложение.

  2. Angular Junior Developer: путь к первому проекту Освойте базовые инструменты Angular и соберите портфолио из нескольких мини-проектов.

  3. Основы Angular: компоненты, маршруты и формы Научитесь работать с архитектурой Angular и создавать интерактивные интерфейсы.

  4. Фронтенд на Angular: практика для начинающих разработчиков Практический курс по созданию динамических веб-приложений с использованием Angular.

  5. Angular за 72 часа: стартовая подготовка фронтенд-разработчика Интенсивное погружение в Angular: от установки до деплоя первого приложения.

  6. Разработка SPA на Angular: от обучения к портфолио Курс для тех, кто хочет научиться создавать полноценные одностраничные приложения.

  7. Angular Junior Lab: мини-курсы для начинающих Серия коротких практических курсов по работе с компонентами, формами, HTTP и сервисами.

  8. Программирование на TypeScript и Angular: от теории к практике Изучите язык TypeScript и его применение в реальной Angular-разработке.

  9. Angular для школьников: первые шаги во фронтенд-разработку Образовательная программа для подростков 14–17 лет — от верстки до своего SPA.

  10. Фронтенд-разработчик с нуля: углубление в Angular Структурированный курс для тех, кто хочет начать карьеру во фронтенде с Angular.

  11. Angular Junior School: первый опыт создания веб-приложений Подготовка к роли Junior Frontend Developer с практическими задачами и проектами.

  12. Как создать приложение на Angular: от идеи до деплоя Краткий курс по основам создания SPA — от настройки среды до публикации в интернете.

  1. Angular для начинающих: от теории к первому проекту
    Изучите основы Angular с нуля и создайте своё первое SPA за несколько занятий.

  2. Angular Junior Bootcamp: первый шаг в профессию
    Интенсив для новичков: базовые навыки, практика и портфолио из реальных задач.

  3. Angular Step-by-Step: структурированное обучение для новичков
    Курс с пошаговым освоением ключевых возможностей фреймворка.

  4. Основы Angular: компоненты, сервисы и маршрутизация
    Углубленное изучение ключевых модулей Angular на практических примерах.

  5. SPA на Angular: создание интерактивных веб-приложений
    Научитесь строить динамические одностраничные приложения с нуля.

  6. Angular Junior Developer: от обучения до первого собеседования
    Программа подготовки к роли Junior Angular-разработчика с поддержкой карьерного роста.

  7. Разработка на Angular: практикум для начинающих разработчиков
    Курс, ориентированный на практическую реализацию типовых задач во фронтенде.

  8. Angular за месяц: начальный уровень за 4 недели
    Компактный и понятный курс по освоению Angular за короткий срок.

  9. Angular для самоучек: как выучить фронтенд без курсов
    Практическое руководство для тех, кто хочет освоить Angular самостоятельно.

  10. Angular Junior Start: первый опыт создания веб-приложений
    Курс для полного старта: от установки до первой рабочей страницы.

  11. Фронтенд-разработчик на Angular: углубление в SPA
    Обучение работе с компонентами, формами и HTTP-запросами в реальных условиях.

  12. Angular в браузере: онлайн-курс для начинающих разработчиков
    Образовательная программа с практическими заданиями в браузере без установки сред.

  13. Angular Junior Track: дорожка развития новичка
    Обучающий трек для тех, кто хочет стать частью IT-команды через 2–3 месяца.

Заявка ученика, студента, слушателя
Заявка преподавателя, репетитора админу сети.
17:34
39
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.