Как вставлять Angular 2 компонента в разные узлы DOM на простой странице JavaScript?

Пример использования: Клиент хочет создать библиотеку, состоящую из Angular 2 компонентов, но предоставляющую абстрагированный, технологично-агностический интерфейс для конечного пользователя (разработчика) этой библиотеки, так что эти пользователи могут использовать простой JavaScript и не знать о внутренних компонентах библиотеки.

Трудность возникает из следующего:

  • Существует страница, в которой используется обычный JavaScript. Эта страница разработана сторонними организациями.
  • Третья сторона должна иметь возможность вставить данный компонент Angular 2 в определенные места (узлы DOM) на странице.
  • Скажем, что компонент <mg-input>, и он должен отображаться в заголовке простой страницы JavaScript, но не только там - также в форме вниз по странице. Два разных места, два разных узла DOM, которые имеют между собой простой html.

Вопрос: как мы загружаем компонент в определенный DOM node и как мы передаем конфигурацию (а не примитивы, но сложный объект) для этих компонентов?

В мире React это выполняется просто запустив ReactDom.render(domEl, <CustomInput nonPrimitiveConfig={config}/>) и в зависимости от того, что domEl и config, компонент будет отображаться в разных местах с различной конфигурацией.

Как это сделать в Angular 2?

Ответ 1

Может быть, спросите, почему они хотят специально Angular 2 компонента?

Мы закодировали автономный "виджет", состоящий из javascript API, пользовательского интерфейса и стиля. Разработчик приложения вызывает функцию javascript для его запуска.

Все, что требуется разработчику, упаковано с нулевыми библиотечными зависимостями.

Ваша альтернатива заключается в том, чтобы скорее разработать компоненты за вычетом пользовательского интерфейса (например, закрытия /SEF ). Затем клиентское приложение может использовать любые технологии, которые они хотят для пользовательского интерфейса.

Ответ 2

Это невозможно с Angular до тех пор, пока не будет добавлено Пользовательские элементы (было объявлено Q4 2017, но github repo был заархивирован по какой-то причине, поэтому я не уверен, будет ли CE продолжен развиваться).

Что бы вы могли сделать, это использовать Stencil для сборки ваших компонентов. Они очень похожи (используйте typescript) на то, как вы создаете компоненты в Angular - такие компоненты затем могут быть загружены самим Angular (с некоторыми базовыми конфигурациями) или любой другой каркас или даже в простой ванильный HTML/JS.

Например, здесь является основным компонентом Stencil.

Основное отличие от Angular заключается в том, что нет отдельного HTML файла шаблона, но вместо этого он использует JSX для визуализации шаблона.

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

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

Ответ 3

Вы должны быть в состоянии использовать angular элементы для достижения этой цели. Angular Elements позволяет создавать класс, который можно зарегистрировать в большинстве популярных браузеров как пользовательский элемент. Затем пользовательский элемент можно использовать точно так же, как любой другой элемент DOM, и он включает угловое связывание и обнаружение изменений. Проверьте это для более подробной информации: https://angular.io/guide/elements

Редактировать: Эта функциональность существует только для Angular 6+. Если вам необходимо использовать Angular 2, это не вариант.