Я хочу вручную скомпилировать HTML-код, содержащий директивы. Что эквивалентно $compile
в Angular 2?
Например, в Angular 1 я мог динамически скомпилировать фрагмент HTML и добавить его в DOM:
var e = angular.element('<div directive></div>');
element.append(e);
$compile(e)($scope);
Ответы:
Угловой 2.3.0 (07.12.2016)
Чтобы получить все подробности, проверьте:
Чтобы увидеть это в действии:
Принципы:
1) Создать шаблон
2) Создать компонент
3) Создать модуль
4) Скомпилировать модуль
5) Создать (и кэшировать) ComponentFactory
6) использовать Target для создания его экземпляра
Краткий обзор, как создать компонент
Способ внедрения компонента в NgModule
Фрагмент кода, как создать
ComponentFactory
(и кэшировать)Фрагмент кода, как использовать результат выше
Полное описание со всеми подробностями читайте здесь , или посмотрите рабочий пример
,
,
источник
ComponentFactory
иViewContainerRef
замену устаревшего DynamicComponentLoader.$compile($element.contents())($scope.$new());
а теперь это сотни строк кода, дополненные созданием NgModule ... Это то, что заставляет меня держаться подальше от NG2 и перейти к чему-то лучшему.JitCompiler
если ваш пример может работать сCompiler
от@angular/core
? plnkr.co/edit/UxgkiT?p=previewПримечание: как @BennyBottema упоминает в комментарии, DynamicComponentLoader теперь устарел, следовательно, и этот ответ.
Angular2 не имеет эквивалента $ compile . Вы можете использовать
DynamicComoponentLoader
и взламывать классы ES6 для динамической компиляции кода (см. Этот лист ):Но он будет работать только до тех пор, пока html-парсер не окажется внутри ядра angular2.
источник
DynamicComponentLoader
устарела, как мы делаем то же самое в Angular 2? Скажем, у меня есть модальное диалоговое окно, и я хочу динамически загружать новый компонент по мере его содержимогоУгловая версия, которую я использовал - Angular 4.2.0
В Angular 4 есть ComponentFactoryResolver для загрузки компонентов во время выполнения. Это своего рода реализация $ compile в Angular 1.0, которая удовлетворяет ваши потребности.
В этом примере ниже я загружаю компонент ImageWidget динамически в DashboardTileComponent.
Чтобы загрузить компонент, вам понадобится директива, которую вы можете применить к ng-template, которая поможет разместить динамический компонент.
WidgetHostDirective
эта директива внедряет ViewContainerRef, чтобы получить доступ к контейнеру представления элемента, в котором будет размещаться динамически добавляемый компонент.
DashboardTileComponent (компонент-заполнитель для визуализации динамического компонента)
Этот компонент принимает входные данные, поступающие от родительских компонентов, или вы можете загрузить их из своей службы в зависимости от вашей реализации. Этот компонент выполняет основную роль в разрешении компонентов во время выполнения. В этом методе вы также можете увидеть метод с именем renderComponent (), который в конечном итоге загружает имя компонента из службы и разрешает его с помощью ComponentFactoryResolver и, наконец, устанавливает данные для динамического компонента.
DashboardTileComponent.html
WidgetComponentService
Это сервисная фабрика для регистрации всех компонентов, которые вы хотите разрешить динамически.
ImageTextWidgetComponent (компонент, который мы загружаем во время выполнения)
Добавить Наконец, добавьте этот ImageTextWidgetComponent в свой модуль приложения как entryComponent
TileModel
Оригинальная ссылка из моего блога
Официальная документация
Скачать образец исходного кода
источник
entryComponents
. Без него ваше решение не сработаетэтот пакет npm упростил мне задачу: https://www.npmjs.com/package/ngx-dynamic-template
использование:
источник
Чтобы динамически создать экземпляр компонента и прикрепить его к вашей DOM, вы можете использовать следующий скрипт, который должен работать в Angular RC :
html шаблон:
Компонент загрузчика
источник
Угловой TypeScript / ES6 (Angular 2+)
Работает сразу с AOT + JIT вместе.
Я создал, как его использовать здесь: https://github.com/patrikx3/angular-compile
Компонент: должен иметь контекст и некоторые данные html ...
Html:
источник
$compile(...)($scope)
. Даже в repo readme ничего нет.Вы можете увидеть компонент, который позволяет компилировать простые динамические компоненты Angular https://www.npmjs.com/package/@codehint-ng/html-compiler
источник
Я знаю, что это старая проблема, но я потратил несколько недель, пытаясь понять, как заставить ее работать с включенным AOT. Я смог скомпилировать объект, но не смог выполнить существующие компоненты. Что ж, я наконец решил изменить тактичность, так как я хотел не столько компилировать код, сколько выполнить собственный шаблон. Моя мысль заключалась в том, чтобы добавить html, который может сделать каждый, и зацикливать существующие фабрики. При этом я могу искать элемент / атрибут / и т. Д. имена и выполнить компонент на этом HTMLElement. Я смог заставить его работать и решил, что должен поделиться этим, чтобы сэкономить кому-то огромное количество времени, которое я потратил на это.
источник
Если вы хотите ввести html-код, используйте директиву
Если вы хотите загрузить весь компонент в какое-то место, используйте DynamicComponentLoader:
https://angular.io/docs/ts/latest/api/core/DynamicComponentLoader-class.html
источник