Комментарии 14
Из подмеченных мною минусов использования transclusion, не получается использовать стандартную передачу данных из компонента в компонент через Input/Output, приходится использовать redux-архитектуру или завязываться на сервисы.
Тут можно еще про ContentChild/ContentChildren добавить.
Отличное описание! Я давно хотел в этом разобраться, но не находилось времени/мотивации исследовать. А у вас прямо справочник получился.
Это очень мощный инструмент для создания гибких и переиспользуемых компонентов.
Всё-таки правильнее будет сказать "ущербный" или, если более политкорректно, "подходящий для совсем простых случаев", самый большой косяк в нем это что он наследует контекст того места где определен (т.е. AppComponent
), что например не позволяет сделать вот так:
// app.html
<my-select>
<option>...</option>
</my-select>
// my-select.html
<select>
<ng-content><ng-content>
</select>
Прикол тут в том что визуально все как бы нормально, но на самом деле если посмотреть внутрь angular-а то можно заметить что option
ы регистрируются вselect
e, но тут этого не происходит по очевидной причине (другой контекст) и рождаются всякие баги https://github.com/angular/angular/issues/26273 (впрочем <select>
сам по себе тоже довольно сильно баганый...).
А еще нет никакого способа задать содержимое по умолчанию, что довольно часто нужно (см https://github.com/angular/angular/issues/12530).
Поэтому по сути годится только для иконок :(
Насчет содержимого по дефолту согласен. Пару раз очень бы пригодилось.
Мы используем ng-content в основном для layout компонентов. Например, у нас есть хедер, в котором должны быть разные компоненты в зависимости от страницы, но позиция у них одинаковая. И тут идеально подходит ng-content для нас. Так что по поводу «ущебрный» я с вами не совсем согласен.
Проекция контента в Angular или затерянная документация по ng-content