Angular 2动态更改ngTemplateOutlet中的模板

Ang*_*arM 6 angular-template angular

我想动态更改ngTemplateOutlet中的模板.当selectedTab更改时,ngTemplateOutlet将更改.

我有两个基本模板,名为#Tab1和#Tab2.

注意:我正在使用角度版本4.

选项卡菜单示例(HTML):

<div class="tabMenu">   
    <ul>
        <li *ngFor="let tab of tabLinks" [class.active]="selectedTab.name === tab.name">
            <a (click)="selectedTab = tab">{{ tab.name }}</a>
        </li>
    </ul>

    <div class="tabContent">        
        <tab [data]="selectedTab.data">
            <ng-container *ngTemplateOutlet="selectedTab.name;context:selectedTab"></ng-container>
        </tab>

        <ng-template class="tab1" #Tab1 let-test="data">
            <p>Template A - {{ test }}</p>          
        </ng-template>

        <ng-template class="tab1" #Tab2 let-test="data">
            <p>Template B - {{ test }}</p>          
        </ng-template>

    </div>
 </div>
Run Code Online (Sandbox Code Playgroud)

这是基本的打字稿数组:

tabLinks: Array<Object> = [
    {
        name: "Tab1",
        data: "data tab 1"
    },
    {
        name: "Tab2",
        data: "data tab 2"
    }
];

selectedTab: Object = this.tabLinks[0];
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 5

如果使用@ViewChild()而不是直接模板变量引用,则可以使用this['foo']以访问名为的字段foo:

@ViewChild('Tab1') tab1:TemplateRef<any>;
@ViewChild('Tab2') tab2:TemplateRef<any>;
Run Code Online (Sandbox Code Playgroud)
    <ng-template class="tab1" #Tab1 let-test="data">
        <p>Template A - {{ test }}</p>          
    </ng-template>

    <ng-template class="tab1" #Tab2 let-test="data">
        <p>Template B - {{ test }}</p>          
    </ng-template>
Run Code Online (Sandbox Code Playgroud)
        <ng-container *ngTemplateOutlet="this[selectedTab.name];context:selectedTab"></ng-container>
Run Code Online (Sandbox Code Playgroud)