Фронтенд-разработчик Angular (Начальный уровень)
Описание программы:
Курс разработан для начинающих фронтенд-разработчиков и направлен на освоение базовых навыков создания динамических веб-приложений с использованием фреймворка 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, собеседования
- Рекомендации по дальнейшему развитию в веб-разработке
Итоговая аттестация:
- Выполнение и защита дипломного проекта
- Тестирование знаний по пройденным темам
- Получение сертификата об окончании курса
-
Что такое Angular и для чего он используется?
Angular — это JavaScript-фреймворк с открытым исходным кодом, разработанный Google для создания одностраничных приложений (SPA). -
Какие основные особенности Angular вы знаете?
TypeScript, модульность, компонентно-ориентированная архитектура, маршрутизация, реактивные формы, инъекция зависимостей. -
Что такое SPA и как Angular помогает в его создании?
SPA — это веб-приложение, которое загружается один раз и обновляется динамически. Angular предоставляет все необходимые инструменты для реализации SPA. -
Что такое TypeScript и почему он важен для Angular?
TypeScript — это надстройка над JavaScript с поддержкой статической типизации, которая улучшает читаемость и масштабируемость кода. Angular использует TypeScript как основной язык разработки. -
Что такое компонент в Angular?
Компонент — это основной строительный блок Angular-приложения, который связывает логику, шаблон и стили. -
Что включает в себя декоратор @Component?
Декоратор @Component определяет метаданные компонента: selector, templateUrl, styleUrls и другие параметры. -
Что такое модуль в Angular?
Модуль — это контейнер, который объединяет компоненты, директивы, сервисы и другие элементы приложения. Основной модуль называется AppModule. -
Что такое директивы в Angular? Чем они отличаются от компонентов?
Директивы изменяют поведение или внешний вид DOM-элементов. В отличие от компонентов, у них нет собственного шаблона. -
Что такое пайпы в Angular и приведите пример их использования.
Пайпы используются для преобразования данных в шаблонах. Например, {{ date | date }} выводит дату в нужном формате. -
Что такое сервисы в Angular и зачем они нужны?
Сервисы содержат бизнес-логику и данные, не связанные напрямую с пользовательским интерфейсом. Они помогают организовать повторное использование кода. -
Что такое инъекция зависимостей (DI) в Angular?
Это механизм, позволяющий автоматически передавать зависимости (например, экземпляры сервисов) в компоненты или другие классы. -
Что такое маршрутизация в Angular и как она настраивается?
Маршрутизация позволяет переходить между различными представлениями приложения. Настраивается через RouterModule и Routes. -
Как добавить новый компонент в Angular-проект?
С помощью команды Angular CLI: ng generate component my-component или вручную, создав класс и декоратор @Component. -
Что такое жизненный цикл компонента в Angular?
Это набор методов (хуков), которые вызываются на разных этапах существования компонента: ngOnInit, ngOnDestroy и другие. -
Что такое двухстороннее связывание данных в Angular?
Это механизм, при котором изменения в модели сразу отражаются в представлении и наоборот. Реализуется с помощью [(ngModel)]. -
Как работает привязка данных в Angular?
Angular поддерживает несколько видов привязки: интерполяция {{ }}, свойства [property], события (event), и двухсторонняя [(ngModel)]. -
Что такое HTTP-клиент в Angular и как он используется?
HttpClient — это модуль Angular для выполнения HTTP-запросов к бэкенду. Используется для получения и отправки данных. -
Что такое реактивные формы в Angular?
Реактивные формы — это способ управления состоянием формы через программный подход, с использованием FormGroup, FormControl и FormBuilder. -
Чем отличаются реактивные формы от шаблонных форм?
Реактивные формы более предсказуемы и подходят для сложных форм, тогда как шаблонные формы удобны для простых случаев и управляются из шаблона. -
Что такое Observables и зачем они нужны в Angular?
Observables — это объекты, предоставляющие поток данных, которые можно подписаться и обрабатывать. Используются для работы с асинхронными операциями, такими как HTTP-запросы. -
Что такое RxJS и как он связан с Angular?
RxJS — это библиотека реактивного программирования, используемая в Angular для работы с Observables и асинхронными операциями. -
Как установить и использовать Angular CLI?
Angular CLI устанавливается через npm: npm install -g @angular/cli. Затем можно создавать проекты и генерировать файлы с помощью команд, например, ng new или ng generate. -
Как опубликовать Angular-приложение?
После сборки с помощью ng build, файлы из папки dist можно загрузить на хостинг или использовать инструменты вроде Firebase Hosting, Netlify, Vercel. -
Что такое ViewChild и ViewChildren в Angular?
Это декораторы, которые позволяют получать доступ к дочерним элементам или компонентам из шаблона в коде. -
Какие рекомендации по организации структуры проекта в Angular вы знаете?
Создавать отдельные папки для компонентов, сервисов, модулей, использовать feature модули, разделять логику и UI, следовать соглашениям Angular Style Guide.
-
Что такое интерполяция в Angular и как она используется?
Интерполяция — это способ вывода данных в шаблоне через двойные фигурные скобки, например: {{ title }}. -
Какие типы директив существуют в Angular?
Существует три типа директив: компоненты, структурные директивы (например, *ngIf, *ngFor), атрибутные директивы (например, ngClass, ngStyle). -
Что такое структурная директива? Приведите пример.
Структурная директива изменяет структуру DOM. Пример: *ngFor используется для циклического отображения элементов. -
Что такое атрибутная директива? Приведите пример.
Атрибутная директива изменяет внешний вид или поведение DOM-элемента. Пример: ngClass добавляет классы к элементу динамически. -
Как создать собственную директиву в Angular?
С помощью команды Angular CLI: ng generate directive my-directive. Затем реализовать логику в файле директивы и подключить её в модуле. -
Что такое пайп (pipe) и как его создать?
Пайп преобразует данные перед выводом в шаблоне. Собственный пайп создаётся с помощью команды ng generate pipe my-pipe и реализации метода transform(). -
Что такое асинхронный пайп в Angular?
AsyncPipe автоматически подписывается на Observable или Promise и возвращает значение, обновляя шаблон при его изменении. -
Что такое инпуты и аутпуты в Angular?
@Input() позволяет передавать данные из родительского компонента в дочерний. @Output() используется для отправки событий из дочернего компонента в родительский. -
Что такое жизненный цикл сервиса в Angular?
Жизненный цикл сервиса зависит от области его предоставления. Если он зарегистрирован в корневом модуле, то существует всё время работы приложения. -
Как использовать HttpClient в Angular?
Сначала импортировать HttpClientModule в AppModule. Затем внедрить HttpClient в сервис через конструктор и вызвать методы get(), post() и т.д. -
Что такое observable и как его подписаться?
Observable — это поток данных. Подписка осуществляется с помощью метода subscribe(), где можно указать callback для получения данных. -
Что такое оператор map в RxJS и как он используется?
Оператор map преобразует данные из одного вида в другой. Используется в цепочке Observable, например, после HTTP-запроса. -
Что такое catchError в RxJS?
catchError перехватывает ошибки в Observable и позволяет выполнить действие, например, вернуть дефолтное значение или обработать ошибку. -
Что такое Subject и чем он отличается от Observable?
Subject — это особый тип Observable, который позволяет рассылать данные всем подписчикам. Он может быть источником и получателем данных. -
Что такое BehaviorSubject и зачем он нужен?
BehaviorSubject — это тип Subject, который хранит последнее значение и отправляет его новым подписчикам при их подключении. -
Что такое ngOnDestroy и когда он вызывается?
Это хук жизненного цикла, который вызывается перед уничтожением компонента. Часто используется для отписки от Observable. -
Что такое ViewChild и как получить доступ к элементу?
ViewChild позволяет получить прямой доступ к элементу DOM или экземпляру компонента в шаблоне через свойство в классе компонента. -
Что такое HostListener и HostBinding в Angular?
HostListener реагирует на события хост-элемента, HostBinding связывает свойства хост-элемента с данными компонента. -
Что такое ContentChild и чем он отличается от ViewChild?
ContentChild используется для доступа к контенту, проектируемому через <ng-content>, тогда как ViewChild обращается к элементам внутри собственного шаблона. -
Что такое маршруты с параметрами и как их получить?
Маршруты с параметрами позволяют передавать данные через URL. Получают их через ActivatedRoute.snapshot.params или subscribe(). -
Что такое canActivate в маршрутизации?
canActivate — это защитник маршрута, который определяет, разрешено ли пользователю перейти на определённую страницу. -
Что такое resolve в маршрутизации и зачем он нужен?
Resolve — это механизм предварительной загрузки данных перед активацией маршрута, чтобы не показывать пустую страницу. -
Что такое lazy loading в Angular и как он работает?
Lazy loading — это подход, при котором модуль загружается только при необходимости, что улучшает производительность при первом запуске. -
Что такое environment в Angular и как его использовать?
Environment — это файлы с переменными окружения, которые используются для хранения настроек, таких как API-ключи или режим разработки/продакшена. -
Как организовать работу с формами в Angular?
Angular поддержает две формы работы: шаблонные формы (через #templateReference) и реактивные формы (через FormGroup, FormControl).
-
Что такое декоратор @NgModule и для чего он используется?
@NgModule используется для определения модуля Angular, который группирует компоненты, директивы, пайпы и сервисы. Определяет, что включает модуль и какие зависимости требуются. -
Какие основные секции есть у декоратора @NgModule?
Основные секции: declarations (компоненты, директивы, пайпы), imports (внешние модули), exports (что доступно другим модулям), providers (сервисы), bootstrap (корневой компонент). -
Что такое Angular CLI и каковы его основные команды?
Angular CLI — это инструмент командной строки для автоматизации создания и управления проектами. Основные команды: ng new, ng generate, ng serve, ng build, ng test. -
Что такое интерфейс в TypeScript и как он используется в Angular?
Интерфейс определяет форму объекта. В Angular часто используется для описания структуры данных, например, при работе с API. -
Что такое класс в TypeScript и как он используется в Angular?
Класс — это шаблон для создания объектов. В Angular классы используются для реализации компонентов, сервисов и других частей приложения. -
Что такое декоратор @Injectable и где он применяется?
@Injectable используется для пометки класса как сервиса, который может быть внедрён через DI. Обычно применяется в сервисах. -
Что такое сервис с providedIn: 'root'?
Это способ регистрации сервиса на уровне корневого модуля, чтобы он был доступен во всём приложении без необходимости добавления в providers. -
Что такое lazy loading модулей и как его настроить?
Lazy loading — это загрузка модулей по требованию. Настраивается через маршрутизацию с указанием loadChildren вместо components. -
Как использовать роутинг в Angular?
Роутинг настраивается в файле app-routing.module.ts, где создаётся массив маршрутов и подключается RouterModule.forRoot(routes). -
Что такое ActivatedRoute и как он используется?
ActivatedRoute предоставляет информацию о текущем маршруте, включая параметры, данные, дочерние маршруты и т.д. -
Что такое RouterOutlet и для чего он нужен?
RouterOutlet — это директива, которая служит местом отображения содержимого, связанного с текущим маршрутом. -
Как передавать данные между компонентами в Angular?
Через @Input() и @Output(), через сервисы, через маршруты (data или параметры), через RxJS Subject/BehaviorSubject. -
Что такое EventEmitter в Angular?
EventEmitter — это механизм, используемый с @Output(), для отправки событий из дочернего компонента в родительский. -
Что такое двухстороннее связывание и как оно реализуется в Angular?
Двухстороннее связывание позволяет синхронизировать модель и представление. Реализуется через [(ngModel)]. -
Что такое NgModel и в каком модуле он находится?
NgModel — это директива для двухстороннего связывания. Находится в FormsModule. -
Что такое реактивные формы и какие классы они используют?
Реактивные формы строятся с использованием классов FormGroup, FormControl, FormArray и FormBuilder. -
Что такое FormBuilder и зачем он нужен?
FormBuilder — это удобный способ создания форм в Angular, позволяющий создавать FormGroup и FormControl с меньшим количеством кода. -
Как проверять валидность формы в Angular?
С помощью свойства valid у FormGroup или FormControl. Также можно использовать Validators.required, Validators.email и другие. -
Что такое observable и как он отличается от promise?
Observable — это поток данных, который может иметь несколько значений и поддерживает операторы. Promise — однократное выполнение с одним результатом. -
Что такое subscribe и когда он используется?
subscribe — метод, который активирует подписку на Observable и позволяет получать данные, ошибки и завершение потока. -
Что такое pipe async и как он работает?
AsyncPipe автоматически подписывается на Observable или Promise и возвращает значение, обновляя шаблон при изменении. -
Что такое HTTP Interceptor и зачем он нужен?
HTTP Interceptor — это механизм перехвата и изменения HTTP-запросов и ответов, например, для добавления заголовков или логирования. -
Как установить и использовать HttpClientModule?
HttpModule заменён на HttpClientModule. Он импортируется в AppModule и предоставляет HttpClient для работы с REST API. -
Что такое environment.prod.ts и для чего он используется?
Это файл окружения, содержащий настройки для продакшена, такие как URL API. Используется для разделения конфигураций между разными средами. -
Как тестировать компоненты в Angular?
Тестирование проводится с использованием Jasmine и Karma через файл .spec.ts. Можно проверять логику, шаблоны, взаимодействие с сервисами.
-
Какой язык программирования используется по умолчанию в Angular?
A) JavaScript
B) TypeScript
C) Dart
D) CoffeeScript
Правильный ответ: B) TypeScript -
Что из перечисленного является основным строительным блоком Angular-приложения?
A) Сервис
B) Модуль
C) Компонент
D) Пайп
Правильный ответ: C) Компонент -
Какой декоратор используется для создания компонента в Angular?
A) @NgModule
B) @Component
C) @Injectable
D) @Directive
Правильный ответ: B) @Component -
Что такое SPA?
A) Статическая HTML-страница
B) Веб-приложение, загружаемое за один раз
C) База данных
D) REST API
Правильный ответ: B) Веб-приложение, загружаемое за один раз -
Какой модуль Angular используется для работы с HTTP-запросами?
A) HttpClientModule
B) FormsModule
C) RouterModule
D) BrowserModule
Правильный ответ: A) HttpClientModule -
Какой символ используется для интерполяции данных в шаблоне Angular?
A) []
B) ()
C) {{ }}
D) #
Правильный ответ: C) {{ }}
-
Какой директивы не существует в Angular?
A) *ngIf
B) *ngFor
C) *ngSwitch
D) *ngWhile
*Правильный ответ: D) ngWhile -
Какой тип формы НЕ поддерживается в Angular?
A) Шаблонная форма
B) Реактивная форма
C) Динамическая форма
D) MVC форма
Правильный ответ: D) MVC форма -
Для чего используется @Input() в компоненте?
A) Для отправки событий
B) Для передачи данных от родителя к дочернему
C) Для доступа к DOM
D) Для маршрутизации
Правильный ответ: B) Для передачи данных от родителя к дочернему -
Для чего используется @Output() в компоненте?
A) Для получения данных от дочернего
B) Для передачи данных от дочернего к родителю
C) Для вызова HTTP-запроса
D) Для изменения стиля элемента
Правильный ответ: B) Для передачи данных от дочернего к родителю -
Как называется корневой модуль Angular-приложения?
A) AppModule
B) MainModule
C) CoreModule
D) RootModule
Правильный ответ: A) AppModule -
Какой инструмент используется для создания проектов и генерации файлов в Angular?
A) WebStorm
B) Angular CLI
C) VS Code
D) Node.js
Правильный ответ: B) Angular CLI -
Какая команда создает новый Angular-проект?
A) ng generate project
B) ng new my-app
C) npm create angular-app
D) ng init
Правильный ответ: B) ng new my-app -
Что такое Observables в Angular?
A) Объекты для хранения данных
B) Асинхронные потоки данных
C) Статические методы
D) Типы данных
Правильный ответ: B) Асинхронные потоки данных -
Какой оператор RxJS используется для преобразования данных?
A) catchError
B) map
C) tap
D) take
Правильный ответ: B) map -
Какой сервис используется для маршрутизации между страницами?
A) ActivatedRoute
B) Router
C) Location
D) Http
Правильный ответ: B) Router -
Как получить параметры маршрута в Angular?
A) Через Router.params
B) Через ActivatedRoute.snapshot.params
C) Через Location.path()
D) Через Route.params
Правильный ответ: B) Через ActivatedRoute.snapshot.params -
Что такое lazy loading в Angular?
A) Загрузка всех модулей сразу
B) Загрузка модулей по требованию
C) Упрощённая маршрутизация
D) Минификация кода
Правильный ответ: B) Загрузка модулей по требованию -
Как зарегистрировать сервис на уровне всего приложения?
A) Добавить в providers модуля
B) Использовать providedIn: 'root'
C) Экспортировать из модуля
D) Подключить через import
Правильный ответ: B) Использовать providedIn: 'root' -
Какой механизм позволяет подписаться на изменения Observable?
A) watch()
B) on()
C) subscribe()
D) listen()
Правильный ответ: C) subscribe() -
Что делает async pipe в Angular?
A) Отправляет данные на сервер
B) Автоматически подписывается на Observable или Promise
C) Изменяет стиль элемента
D) Выполняет анимацию
Правильный ответ: B) Автоматически подписывается на Observable или Promise -
Какой файл содержит переменные окружения для продакшена в Angular?
A) environment.ts
B) environment.prod.ts
C) config.ts
D) settings.json
Правильный ответ: B) environment.prod.ts -
Какой пайп используется для форматирования даты?
A) number
B) currency
C) date
D) format
Правильный ответ: C) date -
Что такое ViewChild в Angular?
A) Метод
B) Декоратор
C) Класс
D) Интерфейс
Правильный ответ: B) Декоратор -
Какой командой можно запустить Angular-приложение локально?
A) ng build
B) ng serve
C) npm start
D) ng run
Правильный ответ: B) ng serve
-
Какой из следующих элементов не является частью архитектуры Angular?
A) Компоненты
B) Сервисы
C) Контроллеры
D) Модули
Правильный ответ: C) Контроллеры -
Что такое декоратор @Directive в Angular?
A) Используется для создания компонентов
B) Применяется для создания пользовательских директив
C) Нужен для маршрутизации
D) Определяет сервис
Правильный ответ: B) Применяется для создания пользовательских директив -
Как создать кастомную директиву с помощью Angular CLI?
A) ng create directive
B) ng generate directive
C) ng new directive
D) ng add directive
Правильный ответ: B) ng generate directive -
Какой тип директивы изменяет структуру DOM?
A) Атрибутная директива
B) Структурная директива
C) Компонент
D) Пайп
Правильный ответ: B) Структурная директива -
Какая директива применяется для динамического добавления класса к элементу?
A) *ngIf
B) *ngFor
C) [ngClass]
D) [ngStyle]
Правильный ответ: C) [ngClass] -
Какой метод жизненного цикла вызывается после инициализации компонента?
A) ngOnDestroy
B) ngOnInit
C) constructor
D) ngAfterViewInit
Правильный ответ: B) ngOnInit -
Какой метод жизненного цикла вызывается перед уничтожением компонента?
A) ngOnChanges
B) ngOnInit
C) ngOnDestroy
D) ngDoCheck
Правильный ответ: C) ngOnDestroy -
Что такое инъекция зависимостей в Angular?
A) Подключение CSS-файлов
B) Передача данных через маршруты
C) Автоматическое предоставление сервисов
D) Создание новых компонентов
Правильный ответ: C) Автоматическое предоставление сервисов -
Как внедрить сервис в компонент?
A) Через конструктор
B) Через шаблон
C) Через декоратор @ViewChild
D) Через переменные окружения
Правильный ответ: A) Через конструктор -
Что означает providedIn: 'root' в декораторе @Injectable?
A) Сервис будет доступен только в текущем компоненте
B) Сервис будет зарегистрирован глобально
C) Сервис будет использоваться только в модуле
D) Сервис будет загружен по требованию
Правильный ответ: B) Сервис будет зарегистрирован глобально -
Что такое маршрутизация в Angular?
A) Обработка HTTP-запросов
B) Переход между представлениями приложения
C) Управление формами
D) Работа с сервисами
Правильный ответ: B) Переход между представлениями приложения -
Какой директивой отображается содержимое маршрута?
A) <router>
B) <route>
C) <router-outlet>
D) <app-router>
Правильный ответ: C) <router-outlet> -
Как получить параметры из URL в Angular?
A) ActivatedRoute.params
B) Router.url
C) Location.path()
D) Route.snapshot
Правильный ответ: A) ActivatedRoute.params -
Что делает метод subscribe()?
A) Завершает выполнение программы
B) Отписывается от события
C) Подписывается на Observable
D) Выполняет синхронный запрос
Правильный ответ: C) Подписывается на Observable -
Какой оператор RxJS используется для обработки ошибок?
A) map
B) tap
C) catchError
D) filter
Правильный ответ: C) catchError -
Что такое Subject в RxJS?
A) Тип данных
B) Специальный класс, позволяющий рассылать данные всем подписчикам
C) Метод
D) Интерфейс
Правильный ответ: B) Специальный класс, позволяющий рассылать данные всем подписчикам -
Что такое BehaviorSubject?
A) Обычный массив
B) Observable, который всегда возвращает последнее значение
C) Метод маршрутизации
D) Директива
Правильный ответ: B) Observable, который всегда возвращает последнее значение -
Какой файл Angular использует для хранения настроек сборки проекта?
A) package.json
B) angular.json
C) tsconfig.json
D) .gitignore
Правильный ответ: B) angular.json -
Как собрать проект с помощью Angular CLI?
A) ng start
B) ng run
C) ng build
D) ng compile
Правильный ответ: C) ng build -
Как опубликовать Angular-приложение на GitHub Pages?
A) ng deploy
B) ng publish
C) ng deploy --github-pages
D) npm deploy
Правильный ответ: C) ng deploy --github-pages -
Какой командой можно проверить версию Angular CLI?
A) ng -v
B) node -v
C) npm -v
D) cli -version
Правильный ответ: A) ng -v -
Какой пайп используется для форматирования валюты?
A) date
B) number
C) currency
D) percent
Правильный ответ: C) currency -
Что такое ViewChild и как его использовать?
A) Для создания нового компонента
B) Для получения ссылки на дочерний элемент или компонент
C) Для изменения стиля
D) Для маршрутизации
Правильный ответ: B) Для получения ссылки на дочерний элемент или компонент -
Какой метод позволяет отписаться от Observable?
A) unsubscribe()
B) stop()
C) cancel()
D) end()
Правильный ответ: A) unsubscribe() -
Что такое environment.ts в Angular?
A) Файл с логами
B) Файл с переменными окружения
C) Конфигурационный файл для стилей
D) Файл с HTML-шаблонами
Правильный ответ: B) Файл с переменными окружения
-
Какой из следующих элементов не является директивой в Angular?
A) *ngIf
B) *ngFor
C) *ngSwitchCase
D) *ngFunction
*Правильный ответ: D) ngFunction -
Что делает декоратор @HostBinding?
A) Связывает свойства хост-элемента с данными компонента
B) Обрабатывает события хост-элемента
C) Указывает путь к шаблону
D) Регистрирует сервис
Правильный ответ: A) Связывает свойства хост-элемента с данными компонента -
Что такое ContentChild в Angular?
A) Получает доступ к дочерним элементам внутри собственного шаблона
B) Получает доступ к контенту, переданному через <ng-content>
C) Создаёт новый модуль
D) Передаёт данные через маршруты
Правильный ответ: B) Получает доступ к контенту, переданному через <ng-content> -
Какой метод жизненного цикла вызывается при каждом изменении привязанных данных?
A) ngOnInit
B) ngOnChanges
C) ngAfterViewInit
D) ngOnDestroy
Правильный ответ: B) ngOnChanges -
Какая команда создаёт новый компонент в 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 -
Какой тип форм в Angular позволяет использовать FormBuilder?
A) Шаблонные формы
B) MVC формы
C) Реактивные формы
D) JSON формы
Правильный ответ: C) Реактивные формы -
Как получить доступ к данным маршрута до активации компонента?
A) ActivatedRoute.snapshot.data
B) Resolve guard
C) CanActivate guard
D) Router.events
Правильный ответ: B) Resolve guard -
Что такое canActivate в маршрутизации?
A) Защитник маршрута, проверяющий права пользователя на вход
B) Метод для загрузки данных
C) Директива
D) Пайп
Правильный ответ: A) Защитник маршрута, проверяющий права пользователя на вход -
Какой модуль нужно импортировать для работы с реактивными формами?
A) FormsModule
B) ReactiveFormsModule
C) CommonModule
D) RouterModule
Правильный ответ: B) ReactiveFormsModule -
Как называется класс, используемый для создания группы контролов в реактивных формах?
A) FormControl
B) FormGroup
C) FormArray
D) FormBuilder
Правильный ответ: B) FormGroup -
Какой метод используется для установки значения FormControl?
A) setValue()
B) set()
C) updateValue()
D) patch()
Правильный ответ: A) setValue() -
Что означает dirty у FormControl?
A) Поле было изменено пользователем
B) Поле не прошло валидацию
C) Поле обязательное
D) Поле отключено
Правильный ответ: A) Поле было изменено пользователем -
Что такое tap в RxJS?
A) Подписка на Observable
B) Оператор для выполнения побочных действий
C) Обработка ошибок
D) Отписка от Observable
Правильный ответ: B) Оператор для выполнения побочных действий -
Какой командой можно проверить список установленных пакетов в проекте?
A) ng list
B) npm list
C) node list
D) cli packages
Правильный ответ: B) npm list -
Какой файл используется для настройки TypeScript в Angular-проекте?
A) package.json
B) angular.json
C) tsconfig.json
D) environment.ts
Правильный ответ: C) tsconfig.json -
Как добавить CSS-класс к элементу динамически в Angular?
A) [class]
B) [ngClass]
C) [style]
D) Все вышеперечисленное
Правильный ответ: D) Все вышеперечисленное -
Какой атрибут HTML используется для связи с переменной шаблона в Angular?
A) #
B) @
C) $
D) &
Правильный ответ: A) # -
Как создать кастомный пайп в Angular?
A) ng new pipe
B) ng generate pipe
C) ng create pipe
D) ng add pipe
Правильный ответ: B) ng generate pipe -
Что делает async pipe в шаблоне?
A) Запускает HTTP-запрос
B) Автоматически подписывается на Observable и обновляет шаблон
C) Возвращает Promise
D) Управляет маршрутизацией
Правильный ответ: B) Автоматически подписывается на Observable и обновляет шаблон -
Что такое interceptor в Angular?
A) Компонент
B) Сервис
C) Механизм перехвата HTTP-запросов и ответов
D) Пайп
Правильный ответ: C) Механизм перехвата HTTP-запросов и ответов -
Как зарегистрировать interceptor в Angular?
A) Через providers в модуле
B) Через imports в модуле
C) Через declarations в модуле
D) Через exports в модуле
Правильный ответ: A) Через providers в модуле -
Что такое TestBed в Angular?
A) Сервис для HTTP-запросов
B) Инструмент для тестирования компонентов
C) Модуль маршрутизации
D) Плагин для сборки
Правильный ответ: B) Инструмент для тестирования компонентов -
Какой фреймворк используется для тестирования в Angular?
A) Mocha
B) Jasmine
C) Jest
D) QUnit
Правильный ответ: B) Jasmine -
Какой метод используется для имитации HTTP-ответа в тестах?
A) HttpClient.get()
B) TestBed.inject()
C) HttpTestingController
D) Router.navigateByUrl
Правильный ответ: C) HttpTestingController -
Какой командой запускаются юнит-тесты в Angular?
A) ng test
B) ng run tests
C) npm test
D) ng start --test
Правильный ответ: A) ng test
Экзаменационный билет №1
Теоретическая часть
- Что такое Angular? Какие основные преимущества у этого фреймворка перед другими?
- Объясните разницу между ngIf и hidden в Angular.
Ответы на теоретическую часть:
- Angular — это фреймворк для создания SPA (Single Page Applications), разработанный Google. Основные преимущества:
- Двустороннее связывание данных (two-way data binding).
- Модульность и зависимость на компонентах.
- Встроенный Dependency Injection.
- Использование TypeScript для строгой типизации.
- Полноценный фреймворк (роутинг, HTTP-клиент, формы и т. д.).
- *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
Теоретическая часть
- Что такое NgModule в Angular? Перечислите основные свойства декоратора.
- Как работает *ngFor? Приведите пример использования.
Ответы на теоретическую часть:
- NgModule — это декоратор, определяющий модуль Angular. Основные свойства:
- declarations (компоненты, директивы, пайпы).
- imports (другие модули).
- providers (сервисы).
- bootstrap (корневой компонент).
- *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
Теоретическая часть
- Что такое @Input() и @Output()? Приведите примеры.
- Как работает EventEmitter?
Ответы на теоретическую часть:
- @Input() — передача данных в дочерний компонент.
@Output() — генерация событий из дочернего в родительский.
Пример:
typescript
Copy
Download
@Input() item: string;
@Output() delete = new EventEmitter<string>();
- 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
Теоретическая часть
- Что такое Observable и как его использовать в Angular?
- Как подписаться на Observable и отписаться?
Ответы на теоретическую часть:
- Observable — объект из библиотеки RxJS для асинхронных операций (например, HTTP-запросов).
- Подписка:
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
Теоретическая часть
- Что такое Директива в Angular? Назовите встроенные директивы.
- Как создать свою собственную директиву?
Ответы на теоретическую часть:
- Директива — это инструкция для DOM (например, *ngIf, *ngFor, ngClass).
- Создание директивы:
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
Теоретическая часть
- Что такое интерполяция в Angular? Приведите пример.
- Как работает двустороннее связывание ([(ngModel)])? Где его можно использовать?
Ответы на теоретическую часть:
- Интерполяция — вставка значений переменных в шаблон через {{ }}. Пример:
html
Copy
Download
Run
<p>Привет, {{ username }}!</p>
- [(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
Теоретическая часть
- Что такое Жизненный цикл компонента (Component Lifecycle)? Назовите 3 основных хука.
- Для чего нужен ngOnInit?
Ответы на теоретическую часть:
- Жизненный цикл — этапы от создания до уничтожения компонента. Основные хуки:
- ngOnInit (инициализация),
- ngOnChanges (изменение @Input),
- ngOnDestroy (уничтожение).
- 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
Теоретическая часть
- Что такое Сервисы (Services) в Angular? Как их создать и использовать?
- Объясните, что такое Dependency Injection (DI).
Ответы на теоретическую часть:
- Сервисы — классы для хранения логики, данных или работы с API. Создаются через @Injectable(), регистрируются в providers (или providedIn: 'root').
- 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
Теоретическая часть
- Что такое Роутинг (Routing) в Angular? Как настроить базовый маршрут?
- Как программно перейти на другую страницу?
Ответы на теоретическую часть:
- Роутинг — навигация между компонентами. Настройка в app-routing.module.ts:
typescript
Copy
Download
const routes: Routes = [
{ path: '', component: HomeComponent }
];
- Через 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
Теоретическая часть
- Что такое Pipes в Angular? Приведите 3 примера встроенных пайпов.
- Как создать собственный пайп?
Ответы на теоретическую часть:
- Pipes преобразуют данные прямо в шаблоне. Примеры:
- {{ text | uppercase }},
- {{ date | date:'dd.MM.yyyy' }},
- {{ price | currency }}.
- Через @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
Теоретическая часть
- Что такое декораторы в Angular? Перечислите основные декораторы и их назначение.
- Объясните разницу между реактивными (Reactive) и шаблонно-ориентированными (Template-driven) формами.
Ответы на теоретическую часть:
- Декораторы - это функции, добавляющие метаданные к классам. Основные декораторы:
- @Component - определяет компонент
- @Directive - определяет директиву
- @Injectable - отмечает класс как сервис
- @NgModule - определяет модуль
- @Input и @Output - для взаимодействия между компонентами
- Реактивные формы:
- Создаются программно в классе компонента
- Более гибкие и тестируемые
- Используют 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
Теоретическая часть
- Что такое Guard в Angular? Какие типы Guard вы знаете?
- Объясните назначение CanActivate и CanDeactivate.
Ответы на теоретическую часть:
- Guards - это интерфейсы для контроля доступа к маршрутам. Основные типы:
- CanActivate - разрешает/запрещает доступ к маршруту
- CanDeactivate - разрешает/запрещает уход с маршрута
- CanLoad - разрешает/запрещает загрузку модуля
- Resolve - предварительная загрузка данных перед активацией маршрута
- 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
Теоретическая часть
- Что такое Interceptors в Angular? Для чего они используются?
- Приведите пример использования HTTP Interceptor.
Ответы на теоретическую часть:
- Interceptors - это middleware для HTTP-запросов/ответов. Позволяют:
- Добавлять заголовки (например, Authorization)
- Обрабатывать ошибки
- Логировать запросы
- Модифицировать запросы/ответы
- Добавлять загрузчики
- Пример использования:
- Добавление токена авторизации ко всем запросам
- Обработка 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
Теоретическая часть
- Что такое Content Projection в Angular? Как работает <ng-content>?
- Объясните разницу между <ng-content> и <ng-template>.
Ответы на теоретическую часть:
- Content Projection - это механизм вставки контента из родительского компонента в дочерний. <ng-content>:
- Определяет место, куда будет вставлен контент
- Поддерживает селекторы для выбора определенного контента
- Не создает собственный scope (контент использует контекст родителя)
- Разница:
- <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
Теоретическая часть
- Что такое ViewChild и ViewChildren? В чем разница?
- Когда нужно использовать static: true в @ViewChild?
Ответы на теоретическую часть:
- ViewChild:
- Получает ссылку на один дочерний элемент/компонент/директиву
- Возвращает первый найденный элемент
ViewChildren:
- Получает список всех дочерних элементов
- Возвращает QueryList (можно подписаться на изменения)
- 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 обработка результата) |
Клиентская оптимизация |
Проверка форматов данных до отправки на сервер |
Дополнительные задания для самостоятельной работы
- Реализовать дополнительную защиту от частых попыток входа путем добавления таймера задержки после каждой неудачной попытки.
- Добавить возможность восстановления пароля с использованием Angular Router.
- Использовать реактивные формы (Reactive Forms) вместо шаблонированных форм (Template-driven forms).
- Настройте аутентификацию на стороне сервера с выдачей 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>
Анализ проблемы и выявления причин
- Неправильная передача данных:Возможно, свойства передавались неправильно или вовсе не были переданы. Проверьте синтаксис передачи входных данных в компонент ProductCardComponent.
- Типизация и неопределённые значения:Свойства типа string | undefined или number | undefined позволяют иметь значение undefined, и если оно именно такое, информация не появится на странице.
- Использование ngIf:Можно добавлять условие вывода содержимого карточки, если товар успешно передан.
- Логирование значений:Для проверки текущих значений можно вывести их в консоль внутри конструктора или методов жизненного цикла компонента.
Решение
Шаг 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 для безопасного вывода данных.
- Методы отладки и анализа состояния компонентов через логирование.
Дополнительные задания для самостоятельного изучения
- Сделайте так, чтобы карточки товаров появлялись плавно (например, с эффектом fade-in).
- Создайте фильтрующий механизм для выбора категорий товаров.
- Добавьте корзину покупок, куда пользователи смогут добавлять выбранные товары.
- Подключите внешний 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 |
Работа в команде |
Распределение задач, коммуникация, презентация результата |
Дополнительные задания (по желанию)
- Добавьте фильтрацию задач: все / активные / выполненные.
- Реализуйте сохранение задач в localStorage.
- Сделайте возможность редактирования задачи.
- Добавьте пагинацию или поиск.
- Подключите внешнее 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 |
Сервисы и инъекция зависимостей |
Для централизованного управления данными |
Компоненты и шаблоны |
Структура приложения, связь между компонентами |
Работа в команде |
Распределение задач, презентация, общение |
Дополнительные задания (по желанию)
- Добавьте фильтр по категориям.
- Реализуйте поиск товаров.
- Подключите реальное API (например, fakestoreapi.org).
- Сделайте возможность изменения количества товара в корзине.
- Добавьте анимации перехода между страницами.
Ролевая игра №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 |
Отладка и тестирование |
Проверка граничных случаев |
Дополнительные задания (по желанию)
- Добавьте кастомный валидатор для телефона.
- Сделайте сохранение введённых данных в localStorage.
- Реализуйте динамическое добавление полей (например, несколько телефонов).
- Сделайте переключатель между регистрацией и входом.
- Подключите 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 |
Работа в команде |
Совместная разработка и тестирование |
Дополнительные задания (по желанию)
- Реализуйте директиву для ограничения ввода только числами.
- Сделайте пайп для форматирования даты в удобный формат.
- Создайте директиву для анимации появления элемента.
- Добавьте кастомный пайп для фильтрации массива.
- Сделайте документацию по созданной библиотеке.
Кейс: "Задержка загрузки данных — пользователи ждут дольше минуты"
Описание кейса
Вы — начинающий фронтенд-разработчик на курсе 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 контент |
Показ временного содержимого до полной загрузки |
Таймеры |
Ограничение длительности операций |
Кеширование |
Оптимизация производительности |
Обработка ошибок |
Предоставление обратной связи при неудаче |
Интерфейсы и анимация |
Создание интерактивных элементов и индикаторов загрузки |
Дополнительные задания для самостоятельной работы
- Добавьте поддержку пагинации данных профиля (если они большие) с помощью lazy load.
- Создайте модуль для поддержки международного текста (i18n) на странице профиля.
- Интегрируйте WebSocket для реального времени обновления данных профиля.
- Добавьте анимационные эффекты при появлении и исчезновении элементов страницы.
Интеллект-карта 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, сравнение популярных фреймворков, архитектурные паттерны, работу с состоянием и асинхронностью. Полезен как справочник и база знаний.
-
Angular для новичков: от HTML до SPA Изучите основы фронтенда, TypeScript и создайте своё первое одностраничное приложение.
-
Angular Junior Developer: путь к первому проекту Освойте базовые инструменты Angular и соберите портфолио из нескольких мини-проектов.
-
Основы Angular: компоненты, маршруты и формы Научитесь работать с архитектурой Angular и создавать интерактивные интерфейсы.
-
Фронтенд на Angular: практика для начинающих разработчиков Практический курс по созданию динамических веб-приложений с использованием Angular.
-
Angular за 72 часа: стартовая подготовка фронтенд-разработчика Интенсивное погружение в Angular: от установки до деплоя первого приложения.
-
Разработка SPA на Angular: от обучения к портфолио Курс для тех, кто хочет научиться создавать полноценные одностраничные приложения.
-
Angular Junior Lab: мини-курсы для начинающих Серия коротких практических курсов по работе с компонентами, формами, HTTP и сервисами.
-
Программирование на TypeScript и Angular: от теории к практике Изучите язык TypeScript и его применение в реальной Angular-разработке.
-
Angular для школьников: первые шаги во фронтенд-разработку Образовательная программа для подростков 14–17 лет — от верстки до своего SPA.
-
Фронтенд-разработчик с нуля: углубление в Angular Структурированный курс для тех, кто хочет начать карьеру во фронтенде с Angular.
-
Angular Junior School: первый опыт создания веб-приложений Подготовка к роли Junior Frontend Developer с практическими задачами и проектами.
-
Как создать приложение на Angular: от идеи до деплоя Краткий курс по основам создания SPA — от настройки среды до публикации в интернете.
-
Angular для начинающих: от теории к первому проекту
Изучите основы Angular с нуля и создайте своё первое SPA за несколько занятий. -
Angular Junior Bootcamp: первый шаг в профессию
Интенсив для новичков: базовые навыки, практика и портфолио из реальных задач. -
Angular Step-by-Step: структурированное обучение для новичков
Курс с пошаговым освоением ключевых возможностей фреймворка. -
Основы Angular: компоненты, сервисы и маршрутизация
Углубленное изучение ключевых модулей Angular на практических примерах. -
SPA на Angular: создание интерактивных веб-приложений
Научитесь строить динамические одностраничные приложения с нуля. -
Angular Junior Developer: от обучения до первого собеседования
Программа подготовки к роли Junior Angular-разработчика с поддержкой карьерного роста. -
Разработка на Angular: практикум для начинающих разработчиков
Курс, ориентированный на практическую реализацию типовых задач во фронтенде. -
Angular за месяц: начальный уровень за 4 недели
Компактный и понятный курс по освоению Angular за короткий срок. -
Angular для самоучек: как выучить фронтенд без курсов
Практическое руководство для тех, кто хочет освоить Angular самостоятельно. -
Angular Junior Start: первый опыт создания веб-приложений
Курс для полного старта: от установки до первой рабочей страницы. -
Фронтенд-разработчик на Angular: углубление в SPA
Обучение работе с компонентами, формами и HTTP-запросами в реальных условиях. -
Angular в браузере: онлайн-курс для начинающих разработчиков
Образовательная программа с практическими заданиями в браузере без установки сред. -
Angular Junior Track: дорожка развития новичка
Обучающий трек для тех, кто хочет стать частью IT-команды через 2–3 месяца.
Нет элементов для просмотра