구성 요소가 있다고 가정합니다.
@Component({
selector: 'MyContainer',
template: `
<div class="container">
<!-- some html skipped -->
<ng-content></ng-content>
<span *ngIf="????">Display this if ng-content is empty!</span>
<!-- some html skipped -->
</div>`
})
export class MyContainer {
}
이제이 <ng-content>
구성 요소가 비어있는 경우 일부 기본 콘텐츠를 표시하고 싶습니다 . DOM에 직접 액세스하지 않고 쉽게 할 수있는 방법이 있습니까?
답변
ng-content
a와 같은 HTML 요소를 감싸서 div
로컬 참조를 가져온 다음 ngIf
표현식을 다음과 같이 바인딩합니다 ref.children.length == 0
.
template: `<div #ref><ng-content></ng-content></div>
<span *ngIf="ref.nativeElement.childNodes.length == 0">
Display this if ng-content is empty!
</span>`
답변
@pixelbits 답변에 누락 된 부분이 있습니다. children
부모 템플릿의 줄 바꿈이나 공백으로 인해 children
빈 텍스트 \ 줄 바꿈이있는 요소 가 발생하기 때문에 속성 뿐만 아니라 확인해야합니다 . 더 나은이 확인 .innerHTML
하고 .trim()
그것.
작업 예 :
<span #ref><ng-content></ng-content></span>
<span *ngIf="!ref.innerHTML.trim()">
Content if empty
</span>
답변
17.03.2020 수정
순수 CSS (2 가지 솔루션)
ng-content에 아무것도 투영되지 않는 경우 기본 콘텐츠를 제공합니다.
가능한 선택자 :
-
:only-child
선택자. 여기에서이 게시물을 참조하십시오 : : only-child Selector이것은 더 적은 코드 / 마크 업을 필요로합니다. IE 9 이후 지원 : Can I Use : only-child
-
:empty
선택자. 더 읽으십시오.IE 9 및 부분적으로 IE 7/8 이후 지원 : https://caniuse.com/#feat=css-sel3
HTML
<div class="wrapper">
<ng-content select="my-component"></ng-content>
</div>
<div class="default">
This shows something default.
</div>
CSS
.wrapper:not(:empty) + .default {
display: none;
}
작동하지 않는 경우
공백이 하나 이상 있으면 비어 있지 않은 것으로 간주됩니다. Angular는 공백을 제거하지만 그렇지 않은 경우를 대비합니다.
<div class="wrapper"><!--
--><ng-content select="my-component"></ng-content><!--
--></div>
또는
<div class="wrapper"><ng-content select="my-component"></ng-content</div>
답변
콘텐츠를 삽입 할 때 참조 변수를 추가합니다.
<div #content>Some Content</div>
구성 요소 클래스에서 @ContentChild ()를 사용하여 삽입 된 콘텐츠에 대한 참조를 가져옵니다.
@ContentChild('content') content: ElementRef;
구성 요소 템플릿에서 콘텐츠 변수에 값이 있는지 확인할 수 있습니다.
<div>
<ng-content></ng-content>
<span *ngIf="!content">
Display this if ng-content is empty!
</span>
</div>
답변
주사 elementRef: ElementRef
하고 elementRef.nativeElement
아이가 있는지 확인하십시오 . 이것은 encapsulation: ViewEncapsulation.Native
.
<ng-content>
태그를 감싸고 자녀가 있는지 확인하십시오. 이것은 encapsulation: ViewEncapsulation.Native
.
<div #contentWrapper>
<ng-content></ng-content>
</div>
자녀가 있는지 확인하십시오.
@ViewChild('contentWrapper') contentWrapper;
ngAfterViewInit() {
contentWrapper.nativeElement.childNodes...
}
(검증되지 않은)
답변
기본 콘텐츠를 표시하려면 CSS의 ‘only-child’선택기를 사용하지 마십시오.
https://www.w3schools.com/cssref/sel_only-child.asp
예 : HTML
<div>
<ng-content></ng-content>
<div class="default-content">I am deafult</div>
</div>
CSS
.default-content:not(:only-child) {
display: none;
}
답변
제 경우에는 빈 ng-content의 부모를 숨겨야합니다.
<span class="ml-1 wrapper">
<ng-content>
</ng-content>
</span>
간단한 CSS 작동 :
.wrapper {
display: inline-block;
&:empty {
display: none;
}
}