Как повторить фрагмент 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, даже если это отстой.
2 ответа
обновление 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>
Еще один пример Plunker
который использует данные, переданные как
<template [ngTemplateOutlet]="..." [ngOutletContext]="templateData"
Сюда ngOutletContext
можно использовать в шаблоне как
<template let-image="image">
{{image}}
где image
является собственностью templateData
Если $implicit
используется
<template [ngTemplateOutlet]="..." [ngOutletContext]="{$implicit: templateData}"
ngOutletContext
можно использовать в шаблоне как
<template let-item>
{{item}}
<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>