2017-08-24 33 views
0

我想在父组件的模板中有条件地显示子组件(包括其ContentChildren)。有条件地在父组件中显示子组件及其内容

app.component.html

<parent> 
    <child #initial> 
    <span>Player</span> 
    </child> 
    <child label="Intro"> 
    <span>Intro</span> 
    </child> 
    <child label="Content"> 
    <span>Content</span> 
    </child> 
</tabs> 

期望结果

<parent> 
    <child> 
    <span>Player</span> 
    </child> 
</parent> 

parent.component.ts

@Component({ 
    selector: 'parent', 
    template: `<!--Display {{current}} and its ContentChildren-->`, 
    styleUrls: ['./tabs.component.scss'] 
}) 

export class ParentComponent implements OnInit { 
    @ContentChildren(ChildComponent) childs; 
    @ContentChild("initial") initial; 
    @ContentChild("open") current; 
    ngOnInit(): void { 
    if (this.initial) this.current = this.initial; 
    } 
} 

个child.component.ts

@Component({ 
    selector: 'child', 
    template: `<ng-content></ng-content>`, 
}) 

export class ChildComponent { 
    @Input() label: string; 
} 

尝试为parent.component.html

<ng-container *ngFor="let child in childs"> 
    <child *ngIf="child == current"></child> //ContentChildren as defined in 'app.component.html' are lost now 
</ng-container> 
+0

@Vega是的,没错 –

+0

,你不希望使用ngif或ngswitch ..? – Vega

+0

@Vega它有效巫婆ngIf,但子组件的丢失 –

回答

0

您可以通过使用ngSwitch做。

<parent> 
    <div [ngSwitch]="current"> 
     <child1 *ngSwitchCase="'Intro'" label="Intro"> 
      <span>Intro</span> 
     </child1> 

     <child2 *ngSwitchCase="'Content'" label="Content"> 
      <span>Content</span> 
     </child2> 
    </div> 
</parent> 

如果您不希望ngSwitch和需要动态改变整个模板做的,希望下面的答案将有助于 Dynamic template URLs in Angular 2 Ask

+0

问题在于,子组件的现在是静态的,但它必须是动态的。 –

+0

@Michel酷如果您需要动态更改,链接的答案可能会有用 – Rajez