[英]Angular 2+ using ngTemplateOutlet
我正在嘗試遵循本教程:
https://alligator.io/angular/reusable-components-ngtemplateoutlet/
但是,如果我復制代碼,則無法正常工作。 它顯示:
<ul>
<li></li>
</ul>
代替
<ul>
<li>Static List Template</li>
</ul>
這些屬性仍未定義:
@ContentChild(CardItemDirective, {read: TemplateRef}) cardItemTemplate;
@ContentChild(ListItemDirective, {read: TemplateRef}) listItemTemplate;
編輯:以前的plnkr不正確。 忘了保存。 看到這個:
https://next.plnkr.co/edit/b9kdTXoe8ZRqnuSv?open=lib%2Fapp.ts&deferRun=1&preview
import { Directive } from '@angular/core';
import { Component, ContentChild, Input, TemplateRef } from '@angular/core';
@Directive({
selector: '[cardItem]'
})
export class CardItemDirective {}
@Directive({
selector: '[listItem]'
})
export class ListItemDirective {}
@Component({
selector: 'card-or-list-view',
template: `
<ng-container [ngSwitch]="mode">
<ng-container *ngSwitchCase="'card'">
<ng-container *ngFor="let item of items">
<ng-container *ngTemplateOutlet="cardItemTemplate"></ng-container>
</ng-container>
</ng-container>
<ul *ngSwitchCase="'list'">
<li *ngFor="let item of items">
<ng-container *ngTemplateOutlet="listItemTemplate"></ng-container>
</li>
</ul>
</ng-container>
`
})
export class CardOrListViewComponent {
@Input() items: any[] = [];
@Input() mode: 'card' | 'list' = 'card';
// Read in our structural directives as TemplateRefs
@ContentChild(CardItemDirective, {read: TemplateRef}) cardItemTemplate;
@ContentChild(ListItemDirective, {read: TemplateRef}) listItemTemplate;
}
@Component({
selector: 'app-usage',
template: `
<card-or-list-view
[items]="items"
[mode]="mode">
<div cardItem>
Static Card Template
</div>
<li listItem>
Static List Template
</li>
</card-or-list-view>
`
})
export class UsageExample {
mode = 'list';
items = [
{
header: 'Creating Reuseable Components with NgTemplateOutlet in Angular',
content: 'The single responsibility principle...'
} // ... more items
];
}
您是正確的,因為永遠不會定義ContentChildren,所以它們始終是未定義的。 ngTemplateOutlet將templateRef或組件作為參數,由於您的內容子級從不渲染,因此從未在代碼中的任何位置定義它。 我個人更喜歡去ViewContainerRef / ComponentFactoryResolver路線: https : //angular.io/guide/dynamic-component-loader
這使您可以更精細地控制組件,並可以通過編程方式設置@Input變量。 希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.