Вопросы на собеседовании: Angular-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior Angular-разработчик.
Смотреть пример резюме: Angular-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Компонент Angular представляет собой класс, который управляет переиспользуемой частью пользовательского интерфейса.
- Шаблон описывает HTML, который отображает Angular.
- Класс хранит данные и методы, доступные этому шаблону.
- Декоратор @Component связывает класс с селектором, шаблоном, стилями и зависимостями.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы основную единицу, из которой строятся интерфейсы Angular.
Декоратор @Component передает Angular метаданные, необходимые для создания и отображения компонента.
- selector определяет компонент в другом шаблоне.
- template или templateUrl задает представление, а styles или styleUrl задает локальные стили.
- imports перечисляет зависимости шаблона для standalone-компонента.
Зачем это спрашивают: Сильный ответ называет @Component метаданными фреймворка и раскрывает их основные задачи.
Селектор компонента представляет собой CSS-селектор, по которому Angular находит host-элемент при создании компонента.
- Селектор вроде app-profile используется как HTML-элемент в родительском шаблоне.
- Angular создает экземпляр компонента и отображает его представление внутри найденного host-элемента.
- Уникальный селектор элемента с префиксом помогает избежать конфликтов со стандартными HTML-элементами.
Зачем это спрашивают: Интервьюер оценивает, знаете ли вы, как сослаться на компонент и создать его в шаблоне.
Встроенный шаблон находится в метаданных компонента, а templateUrl указывает на отдельный HTML-файл.
- Свойство template подходит для очень небольшого представления прямо в TypeScript-файле.
- templateUrl отделяет объемную разметку и упрощает ее чтение.
- Оба варианта компилируются как представление компонента и поддерживают одинаковый синтаксис шаблонов Angular.
Зачем это спрашивают: Вопрос проверяет знание двух стандартных способов задать представление компонента.
Шаблон может читать доступные поля компонента и вызывать его методы через свой контекст привязки.
- Интерполяция и привязка свойства читают значения из класса.
- Привязка события может вызвать метод или изменить поле.
- Выражения в шаблоне должны оставаться простыми, потому что Angular вычисляет их при обновлении представления.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы связь между представлением компонента и его классом.
Интерполяция выводит строковое значение выражения, заключенного в двойные фигурные скобки.
- Привязка {{ userName }} читает userName из контекста компонента.
- Angular обновляет показанный текст при изменении связанного значения.
- Интерполяция предназначена для текста и строковых привязок, а не для обработки событий.
Зачем это спрашивают: Вопрос проверяет, можете ли вы объяснить простейшую одностороннюю привязку данных в Angular.
Привязка свойства передает значение выражения компонента в свойство DOM-элемента, директивы или дочернего компонента.
- Квадратные скобки обозначают целевое свойство, например [disabled]="isSaving".
- Angular сохраняет тип значения выражения, а не превращает все в текст.
- Представление получает новые значения, когда Angular обнаруживает соответствующее изменение состояния.
Зачем это спрашивают: Интервьюер хочет увидеть понимание односторонней привязки от состояния компонента к целевому свойству.
Привязка свойства обновляет свойство объекта, а привязка атрибута записывает значение HTML-атрибута.
- [value] обращается к текущему свойству value элемента input.
- [attr.aria-label] обращается к атрибуту, у которого может не быть соответствующего DOM-свойства.
- Значение null в привязке атрибута удаляет этот атрибут.
Зачем это спрашивают: Сильный ответ отличает исходные HTML-атрибуты от текущих свойств, с которыми обычно работает Angular.
Привязка события выполняет выражение шаблона при возникновении события DOM или компонента.
- Круглые скобки задают событие, например (click)="save()".
- Выражение может вызвать метод компонента или присвоить значение.
- Данные идут от источника события обратно в компонент, а не из компонента в представление.
Зачем это спрашивают: Вопрос проверяет понимание того, как шаблоны Angular реагируют на события пользователя и компонентов.
$event представляет данные события, которые Angular передает обработчику в шаблоне.
- Для обычного события DOM это объект события браузера.
- Для выходного события компонента это значение, переданное при его вызове.
- Шаблон может передать его в типизированный метод компонента для обработки.
Зачем это спрашивают: Интервьюер оценивает, знаете ли вы, как данные события попадают в код компонента.
Двусторонняя привязка объединяет входную привязку свойства с соответствующей привязкой события изменения.
- Синтаксис [(...)] показывает значение и записывает изменения обратно.
- [(ngModel)] часто синхронизирует элемент формы с полем компонента.
- Это удобно для редактируемых значений, но по сути остается двумя односторонними потоками.
Зачем это спрашивают: Хороший ответ объясняет оба направления, а не представляет двустороннюю привязку скрытой магией состояния.
Для [(ngModel)] нужна директива NgModel, которую предоставляет FormsModule из Angular.
- Компонент с standalone: false получает FormsModule через imports своего NgModule.
- Standalone-компонент добавляет FormsModule в собственный imports.
- Внутри формы связанному элементу также нужно имя, чтобы Angular зарегистрировал его.
Зачем это спрашивают: Интервьюер проверяет знание базовой зависимости для привязки в формах Angular, управляемых шаблоном.
Они связывают шаблон с компонентом в разных направлениях и служат разным целям.
- Интерполяция выводит выражение как текст.
- Привязка свойства передает типизированное значение из компонента в свойство.
- Привязка события передает данные события из представления или дочернего компонента в обработчик.
Зачем это спрашивают: Вопрос проверяет, умеете ли вы выбирать базовый вид привязки по его назначению.
*ngIf условно добавляет или удаляет блок шаблона в зависимости от выражения.
- Истинное условие создает блок и его Angular-представление.
- Ложное условие удаляет представление, а не просто скрывает элементы через CSS.
- Современный Angular также предлагает встроенную конструкцию @if, но *ngIf часто встречается в существующих приложениях.
Зачем это спрашивают: Интервьюер проверяет понимание условного отображения и статуса прежней структурной директивы.
*ngIf может ссылаться на ng-template как на блок для отображения при ложном условии.
- Веткой then служит элемент с *ngIf, если не указан другой шаблон.
- Параметр else ссылается на шаблонную переменную, например else emptyState.
- Сам ng-template не создает видимый элемент-обертку.
Зачем это спрашивают: Вопрос проверяет базовое знание условных веток и шаблонных ссылок Angular.
*ngFor создает отдельное представление для каждого элемента перебираемой коллекции.
- Синтаксис let открывает текущий элемент внутри повторяемого шаблона.
- Локальные значения index, first и last описывают каждую итерацию.
- Современный Angular также предлагает встроенную конструкцию @for, а *ngFor по-прежнему широко встречается в коде Angular.
Зачем это спрашивают: Интервьюер оценивает понимание традиционной директивы Angular для отображения списков.
Стабильная идентичность элементов помогает Angular переиспользовать правильные DOM-представления при изменении коллекции.
- Без отдельной настройки *ngFor обычно сравнивает элементы по идентичности объектов.
- Функция trackBy может вернуть стабильный ключ, например ID из базы данных.
- Переиспользование представлений сохраняет состояние элементов и не создает DOM заново без необходимости.
Зачем это спрашивают: Сильный ответ джуниора связывает отслеживание списка с правильным и эффективным переиспользованием представлений.
Сокращенная запись каждой структурной директивы разворачивается в отдельный ng-template, поэтому один элемент не может представить два таких преобразования сразу.
- Синтаксис со звездочкой сокращает оборачивание содержимого в шаблон Angular.
- Вложенный ng-container дает отдельную основу для второй директивы.
- Разделение директив также делает порядок их вычисления явным.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы, что стоит за синтаксисом со звездочкой.
Атрибутная директива меняет внешний вид или поведение существующего элемента, компонента или директивы.
- Она не определяет отдельное представление, в отличие от компонента.
- Она применяется к своему элементу через селектор атрибута.
- NgClass и NgStyle служат распространенными встроенными примерами.
Зачем это спрашивают: Вопрос проверяет, отличаете ли вы директивы поведения от компонентов и структурных директив.
NgClass добавляет и удаляет CSS-классы элемента в зависимости от выражения шаблона.
- Он принимает строку классов, массив имен классов или объект с условиями.
- Ключи объекта задают имена классов, а истинные значения включают эти классы.
- Прямая привязка [class.active] обычно проще для одного условного класса.
Зачем это спрашивают: Интервьюер проверяет знание стандартного средства Angular для динамического набора классов.
Закрытые вопросы
- 21
Что делает NgStyle?
- 22
Из каких основных частей состоит пользовательская атрибутная директива?
directives - 23
Что такое сервис Angular?
angular - 24
Что такое внедрение зависимостей в Angular?
angulardependency-injectioninjection - 25
Что такое провайдер при внедрении зависимостей Angular?
angulardependency-injectioninjection - 26
Как класс может получить зависимость в современном Angular?
angulardependencies - 27
Что означает providedIn: 'root' для сервиса Angular?
angular - 28
Что такое NgModule?
modules - 29
Что означают declarations, imports, exports, providers и bootstrap в NgModule?
modules - 30
Что такое standalone-компонент в Angular?
componentsangularstandalone-components - 31
Как standalone-компонент делает другой компонент или директиву доступными своему шаблону?
componentsdirectivesstandalone-components - 32
Можно ли использовать standalone-компоненты вместе с NgModule?
componentsmodulesstandalone-components - 33
Что такое методы жизненного цикла в Angular?
hooksangularlifecycle - 34
Когда вызывается ngOnInit и что в нем следует делать?
lifecycle - 35
Когда вызывается ngOnChanges?
- 36
Какие данные SimpleChanges передает в ngOnChanges?
- 37
Когда вызывается ngOnDestroy и что в нем следует делать?
- 38
Чем конструктор компонента отличается от ngOnInit?
componentslifecycle - 39
Что такое пайп в Angular?
angularpipes - 40
Какие встроенные пайпы Angular должен знать junior-разработчик?
angular - 41
Из каких основных частей состоит пользовательский пайп Angular?
angularpipes - 42
Как работают параметры и цепочки пайпов?
pipes - 43
Что такое форма Angular, управляемая шаблоном?
formsangulartemplates - 44
Почему элементу input с ngModel внутри формы нужен атрибут name?
forms - 45
Что означают valid, invalid, pristine, dirty, touched и untouched в формах Angular?
angular - 46
Как объявляется базовая валидация в форме Angular, управляемой шаблоном?
formsangulartemplates - 47
Что такое роутинг Angular и как задается базовый маршрут?
angular - 48
Для чего используются RouterLink и RouterOutlet?
- 49
Что делает @Input в компоненте Angular?
componentsangular - 50
Что делают @Output и EventEmitter в компоненте Angular?
componentsangular - 51
Как создать standalone-компонент списка товаров, доступный по отдельному маршруту?
componentsstandalone-components - 52
Загруженный список пуст. Как различить загрузку, ошибку, пустой результат и заполненный список?
state - 53
Как отрисовать выбираемые строки, не помещая поведение строки в компонент страницы?
components - 54
В конструкторе ещё нет данных входного параметра. Где выполнять зависящую от них инициализацию?
- 55
Компонент добавляет сторонний event listener в ngOnInit. Какая очистка нужна?
componentslifecycledependencies - 56
Как переиспользовать один badge статуса на нескольких экранах?
- 57
Данные шаблона равны undefined до завершения HTTP. Как предотвратить runtime-ошибки?
templateshttpfundamentals - 58
Связанное значение изменили в ngAfterViewInit и получили ExpressionChangedAfterItHasBeenCheckedError. Как исправить?
- 59
Как создать типизированную форму входа через FormBuilder?
forms - 60
Когда reactive form должна показывать ошибку required?
reactforms - 61
Вы загружаете частичный профиль в FormGroup. Использовать setValue или patchValue?
forms - 62
Как позволить пользователям добавлять и удалять номера телефонов в форме?
forms - 63
Список городов должен обновляться при смене страны. Как это связать?
- 64
Как предотвратить двойную отправку при сохранении формы?
forms - 65
Как сбросить форму после успешного запроса создания, не потеряв значения по умолчанию?
forms - 66
Сервер сообщает, что email уже занят. Как показать это в форме?
forms - 67
Шаблон не находит control с именем email. Что проверить?
templates - 68
Как проверить совпадение password и confirmation?
passwordsvalidation - 69
Поисковая форма отправляет запрос на каждую клавишу. Как сократить запросы?
forms - 70
Кнопка Save активна при invalid-форме. Как найти причину?
forms - 71
Как заполнить edit-форму, чтобы поздний ответ не затер изменения пользователя?
forms - 72
Как получить типизированный список пользователей через HttpClient и передать компоненту?
components - 73
В standalone-приложении не работает injection HttpClient. Как исправить?
standalone-componentsinjection - 74
Как отправить необязательные search и page как query parameters?
queries - 75
Как отправить типизированный create-user запрос и использовать ответ?
- 76
Как сохранить правильный loading при ошибке HTTP-запроса?
http - 77
Два поиска запускаются быстро, и старый ответ приходит последним. Как исправить?
- 78
Один GET HttpClient выполняется дважды из-за двух subscriptions. Как исправить?
- 79
Где преобразовать API-ответ пользователя в меньшую модель для компонента?
componentsapi - 80
Как добавить Authorization header без повторения кода в каждом сервисе?
auth - 81
Запрос деталей возвращает 404. Как обработать его без пустого объекта?
- 82
Как реализовать Retry после ошибки запроса списка?
resilience - 83
Родитель передает user в дочерний editor. Как не мутировать его до Save?
- 84
Как дочернему компоненту сообщить родительскому об удалении строки?
- 85
Дочерний компонент отправляет событие, но обработчик родителя не работает. Что проверить?
- 86
Двум siblings нужен выбранный клиент. Как их связать?
- 87
Как общий сервис передаст последний выбранный элемент поздним подписчикам?
- 88
Подписка на сервис обновляет поле OnPush-компонента, но представление остаётся прежним. Как исправить?
components - 89
Как настроить маршруты списка товаров и обязательного id товара?
config - 90
Когда использовать routerLink вместо Router.navigate?
- 91
Компонент остается смонтированным при переходе /products/1 на /products/2. Как обновить данные?
components - 92
Как хранить page и filter списка в query parameters?
queries - 93
Как добавить not-found страницу для неизвестных routes?
- 94
Как реализовать базовый guard для страницы после входа?
routing - 95
Route parameter отсутствует или не является числом. Как не отправить плохой API-запрос?
api - 96
Компонент вручную подписан на долгий поток и протекает после навигации. Как исправить?
components - 97
Нужна view model из потоков current user и selected project. Как объединить?
- 98
Где использовать map, tap, catchError и finalize в одном loading-потоке?
- 99
Один subscribe вложен в другой для загрузки заказа после смены клиента. Как переписать?
- 100
OnPush-ребенок получает новые значения через async pipe, но мутированный input устарел. Что изменить?
pipesasync