Подтвердить что ты не робот

В Angular 2 проверить, является ли <ng-content> пустым?

Предположим, что у меня есть компонент:

@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?

4b9b3361

Ответ 1

Оберните ng-content в элемент 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>'

Ответ 2

В ответе @pixelbits не хватает некоторых. Нам нужно проверить не только свойство children, потому что любые разрывы строк или пробелы в родительском шаблоне приведут к тому, что элемент children будет содержать пустой текст \linebreaks. Лучше проверить .innerHTML и .trim() это.

Рабочий пример:

<span #ref><ng-content></ng-content></span>
<span *ngIf="!ref.innerHTML.trim()">
    Content if empty
</span>

Ответ 3

При добавлении содержимого добавьте ссылочную переменную:

<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> 

Ответ 4

Вот решение CSS. Это может обеспечить компонент по умолчанию, если ни один не был установлен в ng-content. Поскольку в моем случае они братья и сестры, можно решить это следующим образом.

Which is compatible since IE 9 and partially since IE7/8: https://caniuse.com/#feat=css-sel3

HTML

<div class="my-custom-component-content-wrapper">
    <ng-content select="my-custom-component"></ng-content>
</div>
<my-custom-component>
    This shows something default.
</my-custom-component>

CSS

.my-custom-component-content-wrapper:not(:empty) + my-custom-component {
    display: none;
}

Ответ 5

Вставить 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...
}

(не проверено)

Ответ 6

В моем случае я должен скрыть родителя пустого ng-контента:

<span class="ml-1 wrapper">
  <ng-content>
  </ng-content>
</span>

Простая работа CSS:

.wrapper {
  display: inline-block;

  &:empty {
    display: none;
  }
}