【发布时间】:2017-11-17 19:04:29
【问题描述】:
我是 angular2 的新手,我正在尝试制作一个名为“grid”的小型 angular 组件,它使用嵌入来简单地重新排列其内容。
它的模板
网格组件模板(grid.component.ts)
<div class="grid">
<div class="row">
<div class="col-xs-4">
<ng-content select="[grid-item-index=0]"></ng-content>
</div>
<div class="col-xs-4">
<ng-content select="[grid-item-index=1]"></ng-content>
</div>
<div class="col-xs-4">
<ng-content select="[grid-item-index=2]"></ng-content>
</div>
</div>
<div class="row">
<div class="col-xs-4">
<ng-content select="[grid-item-index=3]"></ng-content>
</div>
<div class="col-xs-4">
<ng-content select="[grid-item-index=4]"></ng-content>
</div>
<div class="col-xs-4">
<ng-content select="[grid-item-index=5]"></ng-content>
</div>
</div>
</div>
这是使用它的父组件的一部分。
父模板
<grid>
<div *ngFor="let item of items; index as i" [attr.grid-item-index]="i">
<span>{{item}}</span>
</div>
</grid>
这是Plunker。
但结果显示没有内容。但是使用...
<grid>
<div grid-item-index="0">item 0</div>
<div grid-item-index="1">item 1</div>
<div grid-item-index="2">item 2</div>
<div grid-item-index="3">item 3</div>
<div grid-item-index="4">item 4</div>
<div grid-item-index="5">item 5</div>
</grid>
效果很好,结果如我所料。
最后一个工作案例的Plunker。
可以使用 ngfor 或类似工具实现此结果。
我尝试使用 nth-child css 伪类来避免使用索引,但它也不起作用。
更新
根据@yurzui(谢谢!!)的回答,我已经取得了一些进展。它允许将具有 grid-item-index 值的内容映射到具有相同 grid-item-index 值的视图容器。
parent.component.html
<grid>
<ng-template *ngFor="let item of items; let i=index"
[grid-item-index]="(items.length-1)-i">
<span >{{item}}</span>
</ng-template>
</grid>
grid-item-index 指令
@Directive({
selector: '[grid-item-index]'
})
export class GridItemIndexDirective {
@Input('grid-item-index') index: any;
constructor(public vcRef: ViewContainerRef, public tRef: TemplateRef) {}
}
grid.component.ts
@ContentChildren(GridItemIndexDirective) sources: QueryList<GridItemIndexDirective>;
@ViewChildren(GridItemIndexDirective) containers: QueryList<GridItemIndexDirective>;
constructor(
private cdRef:ChangeDetectorRef
) {}
ngAfterViewInit() {
const len = this.sources.length;
for (var i = 0; i < len; i++) {
const destinationContainer = this.containers.find(x => x.index == i);
const source = this.sources.find(x => x.index == i);
if (destinationContainer) {
destinationContainer.vcRef.createEmbeddedView(source.tRef);
this.cdRef.detectChanges(); // this solves ExpressionChangedAfterItHasBeenCheckedError
}
}
}
检查这个Plunker
【问题讨论】:
-
你的数据是异步接收的吗?
-
不是,是父组件中定义的数组。
-
你能提供一个Plunker你的问题吗?很难看出是什么导致了这种行为。
-
选项 1 plnkr.co/edit/5YZpGSwhC5epCv6gWhjZ?p=preview 因为
template="已被弃用,所以 plnkr.co/edit/GzaFRu2T8vKqyPdEkBjv?p=preview
标签: angular ngfor transclusion angular2-ngcontent