Авто Биндинг Динамических Компонентов в Angular

Русская версия

🦊 Reactive Fox 🚀
Angular Soviet
3 min readMay 18, 2018

--

Динамичная лисичка в поисках динамических компонентов thekiba.io

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

NgSwitch?…

На сайте Angular недавно появилась статья про динамические формы. Посмотрите реализацию и подумайте, какие проблемы вы видите в предложенном варианте?

Dynamic Forms https://angular.io/guide/dynamic-form

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

Но что делать, если таких компонентов сотня и больше? Как с ними работать и как их поддерживать? Напомню, что это явное нарушение принципов SOLID, ведь при любом изменении придется менять текущую реализацию.

А еще я лис и я не хочу NgSwitch.

Большинство лисов не любят switch case

Что Angular дает из коробки

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

Директива NgComponentOutlet от команды разработчиков Angular, которая сделает всю необходимую работу. Но, к сожалению, при работе с ней вы можете столкнуться с рядом трудностей, о которых поговорим позже.

ComponentFactoryResolver

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

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

Это самый простой способ создания и отображения динамического компонента:

Первые шаги к динамическим компонентам

Посмотрите как это может выглядеть в абстрактном примере.

Динамический компонент
Создание и управление динамическим компонентом

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

Так же, обратите внимание, что у динамического компонента отсутствует хук OnChanges.

https://stackblitz.com/edit/angular-dynamic-components-phase-1

NgComponentOutlet

Может быть NgComponentOutlet решит нашу проблему? (спойлер: нет) В его реализации используется точно такой же принцип, который мы описали в методе по созданию динамических компонентов.

Минусы NgComponentOutlet

У вас не будет доступа к компоненту, поэтому не получится им управлять.

Вам не передадут данные в компонент, то есть если нужно что-то в него передать, то как это вообще это сделать? Использовать Injector?

Отсутствует хук OnChanges, а значит компонент получается c неполноценным жизненным циклом.

Ручное управление динамическими компонентами делает код сложным и громоздким, из-за чего его тяжело поддерживать.

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

Встречайте, NgxComponentOutlet!!! 🎉

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

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

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

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

Сравнение

Исходный код на github, демо на stackblitz с героями, таблицей и формой.

Что дальше?

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

В следующих статьях поговорим о различных кейсах использования динамических компонентов.

--

--

🦊 Reactive Fox 🚀
Angular Soviet

⚡️ Making Fast faster 👩‍💻 Lead Software Engineer using @angular & @dotnet 🌱 Google Developer Expert for Angular ✍ Tech Writer for @AngularInDepth 🦊 he/him