Какие основные сущности существуют в Angular до версии 16, исключая сигналы?
Что проверяют
Знаете ли вы классический Angular, на котором написана большая часть живых проектов: из чего собирается приложение и как части связаны через DI. Оговорка про сигналы значит, что следом спросят про change detection через Zone.js и про RxJS, на которых держалась реактивность до них.
Как отвечать
- компонент: класс с
@Component, шаблоном и стилями. Данные получает через@Input, события отдаёт через@OutputиEventEmitter, живёт по хукамngOnInit,ngOnChanges,ngOnDestroy; - директива: структурная меняет DOM (
*ngIf,*ngFor), атрибутная меняет вид или поведение элемента (ngClass, своя через@Directive). Компонент формально тоже директива, только с шаблоном; - пайп: преобразует значение в шаблоне. По умолчанию pure, то есть пересчитывается только при смене входа по ссылке;
- сервис и DI: класс с
@Injectable, чаще сprovidedIn: 'root'. Инжекторы иерархические: провайдер на уровне компонента даёт каждому экземпляру свой объект. С версии 14 есть функцияinject(); @NgModule:declarations,imports,exports,providers. В 14-й версии появились standalone-компоненты, в 15-й они стабильны и позволяют обходиться без модулей;- роутинг: маршруты, guards, resolvers, ленивая загрузка через
loadChildren.
Формы (FormGroup, FormControl, типизированные с 14-й версии) и HttpClient с интерсепторами подайте как встроенные библиотеки на тех же сервисах и директивах, а не как отдельный вид сущностей.
Реактивность держится на RxJS: HttpClient возвращает Observable, в шаблоне его разворачивает пайп async. Change detection запускает Zone.js после любого асинхронного события, а OnPush сужает проверку до смены инпутов, событий в компоненте и пайпа async.
Где спотыкаются
Утверждают, что без NgModule Angular не работает. До 14-й версии так и было, но в 15-й standalone-подход уже стабилен.
Не могут объяснить, почему pure-пайп не обновился после push в массив. Ссылка на массив прежняя, значит пересчёта не будет.
Забывают про отписку. Подписка на долгоживущий Observable без takeUntil или пайпа async продолжает работать после уничтожения компонента.