Как повторить фрагмент HTML несколько раз без ngFor и без другого @Component

Проблема проста, я хочу повторить фрагмент HTML, несколько раз в моем шаблоне.

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

"Рабочее решение" должно было бы определить конкретный @Component для моего повторного HTML и сделать что-то вроде этого: <p>Whatever html</p><my-repeated-html></my-repeated-html><h4>Whatever</h4><my-repeated-html></my-repeated-html>

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

Есть ли что-нибудь в движке шаблонов ng2, чтобы разрешить определение "внутреннего шаблона" и использовать его везде, где он мне нужен, в текущем шаблоне?

Если ответ нет, я думаю, я предпочел бы дублировать HTML, даже если это будет отстой.

Ответ 1

обновление Angular 5

ngOutletContext было переименовано в ngTemplateOutletContext

См. также https://github.com/angular/angular/blob/master/CHANGELOG.md#500-beta5-2017-08-29

оригинальный

Недавно добавленный ngTemplateOutlet может быть тем, что вы хотите

<template [ngTemplateOutlet]="templateRefExpression" [ngOutletContext]="objectExpression"></template>

В настоящее время он может использоваться как

<template #templateRef>
    <pre>{{self | json }}</pre>
</template>

<template [ngTemplateOutlet]="templateRef"></template>

Шаблон также можно передать дочернему компоненту, который будет отображаться там

@Component({
  selector: 'some-child',
  providers: [],
  template: `
    <div>
      <h2>Child</h2>
<template [ngTemplateOutlet]="template" ></template>
<template [ngTemplateOutlet]="template" ></template>
    </div>
  `,
  directives: []
})
export class Child {
  @ContentChild(TemplateRef) template:TemplateRef;
}

который будет использоваться как

<some-child>
  <template>
    <pre>{{self | json }}</pre>
  </template>
</some-child>

Пример плунжера

Другой Пример плунжера
который использует данные, переданные как

<template [ngTemplateOutlet]="..." [ngOutletContext]="templateData"

Этот способ ngOutletContext может использоваться в шаблоне, например

<template let-image="image">
 {{image}}

где image является свойством templateData

Если используется $implicit

<template [ngTemplateOutlet]="..." [ngOutletContext]="{$implicit: templateData}"

ngOutletContext может использоваться в шаблоне, например

<template let-item>
 {{item}}

Ответ 2

<campaign-channels-list (onItemSelected)="_onItemSelected($event)" [customTemplate]="customTemplate" (onDragComplete)="_onDragComplete($event)" [items]="m_blockList"></campaign-channels-list>
        <template #customTemplate let-item>
            <a href="#" [attr.data-block_id]="item.blockID">
                <i class="fa {{item.blockFontAwesome}}"></i>
                <span>{{item.blockName}}</span>
                <i class="dragch fa fa-arrows-v"></i>
                <span class="lengthTimer hidden-xs"> 
                    {{item.length | FormatSecondsPipe}}
                </span>
            </a>
        </template>

и в rx-компоненте:

<div class="sortableList">
                    <li (click)="_onItemSelected(item, $event, i)" *ngFor="let item of m_items; let i = index" class="listItems list-group-item" [ngClass]="{'selectedItem': m_selectedIdx == i}">
                        <template [ngTemplateOutlet]="customTemplate" [ngOutletContext]="{$implicit: item}">
                        </template>
                    </li>
                </div>

обратите внимание на:

[ngOutletContext]="{$implicit: item}"

а также

<template #customTemplate let-item>