Skip to content

Вопросы на собеседовании: Angular-разработчик

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior Angular-разработчик.

Смотреть пример резюме: Angular-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

componentsangular

Компонент Angular представляет собой класс, который управляет переиспользуемой частью пользовательского интерфейса.

  • Шаблон описывает HTML, который отображает Angular.
  • Класс хранит данные и методы, доступные этому шаблону.
  • Декоратор @Component связывает класс с селектором, шаблоном, стилями и зависимостями.

Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы основную единицу, из которой строятся интерфейсы Angular.

componentsdecorators

Декоратор @Component передает Angular метаданные, необходимые для создания и отображения компонента.

  • selector определяет компонент в другом шаблоне.
  • template или templateUrl задает представление, а styles или styleUrl задает локальные стили.
  • imports перечисляет зависимости шаблона для standalone-компонента.

Зачем это спрашивают: Сильный ответ называет @Component метаданными фреймворка и раскрывает их основные задачи.

componentsangular

Селектор компонента представляет собой CSS-селектор, по которому Angular находит host-элемент при создании компонента.

  • Селектор вроде app-profile используется как HTML-элемент в родительском шаблоне.
  • Angular создает экземпляр компонента и отображает его представление внутри найденного host-элемента.
  • Уникальный селектор элемента с префиксом помогает избежать конфликтов со стандартными HTML-элементами.

Зачем это спрашивают: Интервьюер оценивает, знаете ли вы, как сослаться на компонент и создать его в шаблоне.

templates

Встроенный шаблон находится в метаданных компонента, а templateUrl указывает на отдельный HTML-файл.

  • Свойство template подходит для очень небольшого представления прямо в TypeScript-файле.
  • templateUrl отделяет объемную разметку и упрощает ее чтение.
  • Оба варианта компилируются как представление компонента и поддерживают одинаковый синтаксис шаблонов Angular.

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

componentsangulartemplates

Шаблон может читать доступные поля компонента и вызывать его методы через свой контекст привязки.

  • Интерполяция и привязка свойства читают значения из класса.
  • Привязка события может вызвать метод или изменить поле.
  • Выражения в шаблоне должны оставаться простыми, потому что Angular вычисляет их при обновлении представления.

Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы связь между представлением компонента и его классом.

angulartemplates

Интерполяция выводит строковое значение выражения, заключенного в двойные фигурные скобки.

  • Привязка {{ userName }} читает userName из контекста компонента.
  • Angular обновляет показанный текст при изменении связанного значения.
  • Интерполяция предназначена для текста и строковых привязок, а не для обработки событий.

Зачем это спрашивают: Вопрос проверяет, можете ли вы объяснить простейшую одностороннюю привязку данных в Angular.

angular

Привязка свойства передает значение выражения компонента в свойство DOM-элемента, директивы или дочернего компонента.

  • Квадратные скобки обозначают целевое свойство, например [disabled]="isSaving".
  • Angular сохраняет тип значения выражения, а не превращает все в текст.
  • Представление получает новые значения, когда Angular обнаруживает соответствующее изменение состояния.

Зачем это спрашивают: Интервьюер хочет увидеть понимание односторонней привязки от состояния компонента к целевому свойству.

angular

Привязка свойства обновляет свойство объекта, а привязка атрибута записывает значение HTML-атрибута.

  • [value] обращается к текущему свойству value элемента input.
  • [attr.aria-label] обращается к атрибуту, у которого может не быть соответствующего DOM-свойства.
  • Значение null в привязке атрибута удаляет этот атрибут.

Зачем это спрашивают: Сильный ответ отличает исходные HTML-атрибуты от текущих свойств, с которыми обычно работает Angular.

angular

Привязка события выполняет выражение шаблона при возникновении события DOM или компонента.

  • Круглые скобки задают событие, например (click)="save()".
  • Выражение может вызвать метод компонента или присвоить значение.
  • Данные идут от источника события обратно в компонент, а не из компонента в представление.

Зачем это спрашивают: Вопрос проверяет понимание того, как шаблоны Angular реагируют на события пользователя и компонентов.

angular

$event представляет данные события, которые Angular передает обработчику в шаблоне.

  • Для обычного события DOM это объект события браузера.
  • Для выходного события компонента это значение, переданное при его вызове.
  • Шаблон может передать его в типизированный метод компонента для обработки.

Зачем это спрашивают: Интервьюер оценивает, знаете ли вы, как данные события попадают в код компонента.

angular

Двусторонняя привязка объединяет входную привязку свойства с соответствующей привязкой события изменения.

  • Синтаксис [(...)] показывает значение и записывает изменения обратно.
  • [(ngModel)] часто синхронизирует элемент формы с полем компонента.
  • Это удобно для редактируемых значений, но по сути остается двумя односторонними потоками.

Зачем это спрашивают: Хороший ответ объясняет оба направления, а не представляет двустороннюю привязку скрытой магией состояния.

templates

Для [(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 заново без необходимости.

Зачем это спрашивают: Сильный ответ джуниора связывает отслеживание списка с правильным и эффективным переиспользованием представлений.

directives

Сокращенная запись каждой структурной директивы разворачивается в отдельный ng-template, поэтому один элемент не может представить два таких преобразования сразу.

  • Синтаксис со звездочкой сокращает оборачивание содержимого в шаблон Angular.
  • Вложенный ng-container дает отдельную основу для второй директивы.
  • Разделение директив также делает порядок их вычисления явным.

Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы, что стоит за синтаксисом со звездочкой.

angulardirectives

Атрибутная директива меняет внешний вид или поведение существующего элемента, компонента или директивы.

  • Она не определяет отдельное представление, в отличие от компонента.
  • Она применяется к своему элементу через селектор атрибута.
  • 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