2016-08-01 16 views
11

Załóżmy, że mam prosty komponent panelu Bootstrap z wieloma gniazdami transclusion. Przykładowy szablon:Jak sprawdzić, czy istnieje zawartość ng

<div class="panel panel-default"> 
    <div class="panel-heading"> 
    <ng-content select="my-panel-heading"></ng-content> 
    </div> 
    <div class="panel-body"> 
    <ng-content select="my-panel-content"></ng-content> 
    </div> 
</div> 

Chcę, aby nagłówek panelu był opcjonalny. Jak ukryć <div class="panel-heading"> elementu, jeśli nie ma treści dostarczone przez <ng-content select="my-panel-heading"></ng-content>

+0

'ngIf' powinno być preferowane zamiast' [ukryte] '. Czy istnieje powód, dla którego wolisz "ukryty"? –

+1

@ GünterZöchbauer, jeśli zmienna showHeading została zainicjowana na wartość false, element jest usuwany z szablonu przed wywołaniem ngAfterContentInit, co powoduje, że odwołanie do viewChild jest niezdefiniowane. Jeśli preferowana jest opcja ngIf, możesz zmienić domyślną wartość parametru showHeading na wartość true, która powinna działać. – hendrix

+0

Właściwie to po prostu przetestowałem i nie działało dobrze z * ngIf nawet po zmianie wartości domyślnej na true. Odniesienie do #panelHeading było wciąż niezdefiniowane, ponieważ * ngIf usunął je. – hendrix

Odpowiedz

13

Jeśli masz elementu nadrzędnego <ng-content> z szablonu zmiennej (#panelHeading)

<div class="panel panel-default"> 
    <div class="panel-heading" #panelHeading [hidden]="!showHeading"> 
    <ng-content select="my-panel-heading"></ng-content> 
    </div> 
    <div class="panel-body"> 
    <ng-content select="my-panel-content"></ng-content> 
    </div> 
</div> 

następnie można wyszukać dla niego jak

@ViewChild('panelHeading') panelHeading; 

i ustawić właściwość w zależności od tego, czy są dzieci lub nie

constructor(private cdRef:ChangeDetectorRef) {} 

showHeading:boolean = false; 

ngAfterViewInit() { 
    this.showHeading = this.panelHeading.nativeElement && this.panelHeading.nativeElement.children.length > 0; 
    this.cdRef.detectChanges(); 
} 

Jeśli <my-panel-heading> jest komponentem Angular2, a następnie można również użyć

@ContentChild(MyPanelHeading) panelHeading:MyPanelHeading; 

constructor(private cdRef:ChangeDetectorRef) {} 

showHeading:boolean = false; 

ngAfterViewInit() { 
    this.showHeading = this.panelHeading != null; 
    this.cdRef.detectChanges(); 
} 
+0

Po ustawieniu domyślnej wartości showHeading na "false", this.panelHeading ma wartość "undefined". Ustawiając domyślną wartość showHeading na "true", działa poprawnie, ale otrzymuję "ExpressionChangedAfterItHasBeenCheckedError" w konsoli. Co więcej, muszę użyć "ngAfterViewInit" zamiast "ngAfterContentInit", w przeciwnym razie showHeading jest zawsze niezdefiniowany. Wszelkie pomysły, jak rozwiązać? Thx –

+1

@ Luca, dzięki za informację zwrotną. Zaktualizowałem swoją odpowiedź. Myślę, że teraz 'ngAfterViewInit' jest poprawny. Zaktualizowałem jeszcze kilka rzeczy, które powinny rozwiązać problemy, o których wspomniałeś. –

+0

dziękuję! Dla mojego rozwiązania wolałem używać '* ngIf' zamiast' hidden ', ustawiając domyślną wartość 'showHeading' na true. Teraz wszystko działa poprawnie :) –

3

Trzeba by usunąć wszystkie spacje, ale można to zrobić z CSS, jeśli naprawdę troszczył się o nią (ng-content robi” t zajmują miejsce):

.panel-heading:empty { display: none } 

<div class="panel-heading"><ng-content select="my-panel-heading"></ng-content></div> 
Powiązane problemy