Угловой шаблон и включение: содержание вышло из строя

Я сталкиваюсь с некоторыми проблемами при проектировании контента Angular. У меня есть шаблон, который имеет некоторый общий HTML для каждого экземпляра, который будет использоваться, и другую часть, которая будет изменяться от случая к случаю через включение (ng-content). Проблема в том, что независимо от того, какой порядок я использую в DOM-элементах моего шаблона, выходные данные всегда одинаковы. Вот код:

<ng-template #lol>
  <ng-content select=".world"></ng-content>
  <div>Hello</div>
</ng-template>

<ng-container [ngTemplateOutlet]="lol">
  <div class="world">World</div>
</ng-container>

Я ожидаю, что полученный результат будет:

World
Hello

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

Hello
World

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

ПРИМЕЧАНИЕ. Вот StackBlitz с полным примером: https://stackblitz.com/edit/angular-vfecbs?file=src%2Fapp%2Fapp.component.html

3 ответа

ng-content иметь особую силу, где вы размещаете его, там он заменит выбранный контент.

<ng-template #lol>
  <ng-content select=".world"></ng-content> <--- World will be printed here
  <div>Hello</div>
</ng-template>

Убедитесь, что там, где вы добавляете ng-контент, будет заменен выбранный контент. Если вам нужен Hello in up, просто переместите элемент первым

<ng-template #lol>
  <div>Hello</div>
  <ng-content select=".world"></ng-content> <--- World will be printed
</ng-template>

Контент-проекция - это концепция проецирования контента из одного component другому - если вы передаете какую-то ценность для вас child компонент из parent компонент и значение изменяется динамически, то вы можете перейти к проекции контента

В вашем случае весь <ng-template> передается вашему <ng-container> таким образом, это читается как Hello, World - ничего не происходит с <ng-content> удалите его, вы можете найти тот же результат

<ng-container [ngTemplateOutlet]="lol">
  <div>Hello</div>
  <div class="world">World</div>
</ng-container>

Ваш вывод будет таким, когда вы проверяете свой код - таким образом, только <div>Hello</div> встраивается в ваш контейнер - он не передает контент из <ng-template> - так что, кажется, не способ исправить это

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

Надеюсь, это поможет - счастливое кодирование:)

Вы, вероятно, не используете это правильно. Предположим, что вы используете код шаблона, который вы указали в OP в компоненте с именем HelloComponent,

Затем его следует использовать так:

<app-hello>
  <p class="world">Some projected Content</p>
</app-hello>

Вот образец StackBlitz для вашей ссылки.

Другие вопросы по тегам