我的第一个 Angular2 应用程序(使用 Bootstrap(时遇到了一些问题。它多次调用组件。我认为因为子组件(
父网页文件:
<div class="hidden-xs hidden-sm">
<b>{{studievoortgangStudent?.StudentNaam}}</b>
<div *ngFor="let studievoortgang of studievoortgangStudent?.Studievoortgang">
<b>{{studievoortgang.CROHONaam}}</b>
<table class="table table-responsive" *ngFor="let fase of studievoortgang.Fasen">
<thead>
<tr>
<th>{{fase.NaamFase}}</th>
<th></th>
<th>{{fase.AantalTeBehalenEC}}</th>
<th>{{fase.AantalVirtueelTotaalEC}}</th>
<th>{{fase.AantalVastTeStellenEC}}</th>
<th>{{fase.AantalWerkelijkTotaalEC}}</th>
</tr>
<tr [ngSwitch]="userinfo?.taalid=='2'">
<th></th>
<th *ngSwitchCase="true">Result</th>
<th *ngSwitchDefault>Resultaat</th>
<th *ngSwitchCase="true">EC value</th>
<th *ngSwitchDefault>EC waarde</th>
<th *ngSwitchCase="true">EC virtual</th>
<th *ngSwitchDefault>EC virtueel</th>
<th *ngSwitchCase="true">EC to be determined</th>
<th *ngSwitchDefault>EC vast te stellen</th>
<th *ngSwitchCase="true">EC determined</th>
<th *ngSwitchDefault>EC vastgesteld</th>
</tr>
</thead>
<tbody *ngFor="let eindresultaat of fase.Eindresultaten; ">
<tr data-toggle="tooltip" title="{{eindresultaat.OpmerkingEindresultaat}}" [ngStyle]="{'color':eindresultaat.KleurEindresultaat}">
<td>
<button (click)="show[eindresultaat.Cursus] = !show[eindresultaat.Cursus]" class="btn btn-primary" type="button" title="Toon toetsen">
<span *ngIf="!show[eindresultaat.Cursus]" class="glyphicon glyphicon-menu-hamburger"></span>
<span *ngIf="show[eindresultaat.Cursus]" class="glyphicon glyphicon-arrow-up"></span>
</button>
{{eindresultaat.Cursus}}
</td>
<td>{{eindresultaat.Eindresultaat}}</td>
<td>{{eindresultaat.CursusEC}}</td>
<td>{{eindresultaat.EindresultaatVirtueelEC}}</td>
<td>{{eindresultaat.EindresultaatVastTeStellenEC}}</td>
<td>{{eindresultaat.EindresultaatVastgesteldeEC}}</td>
</tr>
<tr *ngIf="show[eindresultaat.Cursus]">
<td colspan="6">
<studievoortgang-detail-component [toetsmatrijs]="eindresultaat.Toetsmatrijs">Loading...</studievoortgang-detail-component>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hidden-md hidden-lg">
<b>{{studievoortgangStudent?.StudentNaam}}</b>
<div *ngFor="let studievoortgang of studievoortgangStudent?.Studievoortgang">
<b>{{studievoortgang.CROHONaam}}</b>
<table class="table table-responsive" *ngFor="let fase of studievoortgang.Fasen">
<thead>
<tr [ngSwitch]="userinfo?.taalid=='2'">
<th *ngSwitchCase="true">{{fase.NaamFase}}</th>
<th *ngSwitchDefault>{{fase.NaamFase}}</th>
<th *ngSwitchCase="true">Result</th>
<th *ngSwitchDefault>Resultaat</th>
</tr>
</thead>
<tbody *ngFor="let eindresultaat of fase.Eindresultaten">
<tr data-toggle="tooltip" title="{{eindresultaat.OpmerkingEindresultaat}}" [ngStyle]="{'color':eindresultaat.KleurEindresultaat}">
<td>
<button (click)="show[eindresultaat.Cursus] = !show[eindresultaat.Cursus]" class="btn btn-primary" type="button" title="Toon toetsen">
<span *ngIf="!show[eindresultaat.Cursus]" class="glyphicon glyphicon-menu-hamburger"></span>
<span *ngIf="show[eindresultaat.Cursus]" class="glyphicon glyphicon-arrow-up"></span>
</button>
{{eindresultaat.Cursus}}
</td>
</tr>
<tr *ngIf="show[eindresultaat.Cursus]">
<td colspan="2">
<table class="table table-responsive">
<tr [ngSwitch]="userinfo?.taalid=='2'">
<td *ngSwitchCase="true">
<div><b>EC value: </b>{{eindresultaat.CursusEC}}</div>
<div><b>EC determined: </b>{{eindresultaat.EindresultaatVastgesteldeEC}}</div>
<div><b>EC virtual: </b>{{eindresultaat.EindresultaatVirtueelEC}}</div>
<div><b>EC to be determined: </b>{{eindresultaat.EindresultaatVastTeStellenEC}}</div>
</td>
<td *ngSwitchDefault>
<div><b>EC waarde: </b>{{eindresultaat.CursusEC}}</div>
<div><b>EC vastgesteld: </b>{{eindresultaat.EindresultaatVastgesteldeEC}}</div>
<div><b>EC virtueel: </b>{{eindresultaat.EindresultaatVirtueelEC}}</div>
<div><b>EC vast te stellen: </b>{{eindresultaat.EindresultaatVastTeStellenEC}}</div>
</td>
<tr [ngSwitch]="userinfo?.taalid=='2'">
<th *ngSwitchCase="true">Tests</th>
<th *ngSwitchDefault>Toetsen</th>
</tr>
<tr>
<studievoortgang-detail-component [toetsmatrijs]="eindresultaat.Toetsmatrijs">Loading...</studievoortgang-detail-component>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</div>
在此示例中,子组件被调用两次,并执行该组件中的所有服务两次。关于如何解决此问题的任何想法,因为我需要为移动设备/选项卡和桌面提供不同的布局。(那是因为一个div = Hidden-xs Hidden-sm,另一个是hidden-md hidden-lg(
您遇到的问题是每个组件都在 dom 中,并且可以从 angular 获得生命周期钩子的完整处理,只有一个组件是基于引导类隐藏的。
解决此问题的方法是在每个子组件选择器上添加另一个*ngIf
,或者向两个*ngIf="show[eindresultaat.Cursus]
实例添加另一个条件,以确保在任何时间点只有一个子组件处于活动状态。
关于使用 *ngIf
dom 隐藏和删除元素之间区别的角度文档可以在这里找到:https://angular.io/docs/ts/latest/guide/template-syntax.html#!#ngif