2016-02-28 11 views
5

Powiedzmy mam komponent:Angular2 - Get lekkie składnik DOM InnerHTML węzły/dziecko

@Component({ 
    selector: 'foo', 
    template: '<div>foo</div>' 
}) 
export class Foo {} 

I spożywać go w innym składniku tak:

<foo> 
    <h1>some inner HTML</h1> 
</foo> 

Jak mogę się dowiedzieć, czy Foo ma jakieś elementy podrzędne w świetle DOM?

Chcę pobrać wartość <h1>some inner HTML</h1>.

Opcja 1 - @ContentChildren(): Nie można jej użyć do wyszukiwania arbitralnych elementów; obecnie tylko elementy lub zmienne Angular 2 (#foo) mogą być wyszukiwane w ten sposób. Nie chcę dodawać zmiennej do wewnętrznych elementów, jeśli mogę tego uniknąć.

Wariant 2 - elementRef.nativeElement: można wstrzykiwać ElementRef do składnika Foo, ale gdy składnik jest instancja (w konstruktora), wewnętrzne elementy zostały już usunięte, a będzie pusta. Później w cyklu życia (na przykład ngAfterViewInit()) wewnętrzne elementy będą po prostu cieniem DOM (to jest <div>foo</div>).

Jakieś inne metody, których mi brakuje?

Use Case

Aby dać pewien kontekst, dlaczego chcę to zrobić, tworzę składnik biblioteki, która posiada domyślny szablon, który może być zastąpiony przez szablonu niestandardowego, jeśli użytkownik zdecyduje. Więc mój domyślny szablon wygląda tak:

<div *ngIf="hasTemplate"><ng-content></ng-content></div> 
<div *ngIf="!hasTemplate"><!-- the default template --></div> 

Potrzebuję jakiś sposób ustawić hasTemplate do true jeśli istnieje HTML wewnątrz <foo>..</foo> tagów.

Odpowiedz

4
  • Możesz przełączyć się encapsulation: ViewEncapsulation.Native wtedy zawartość będzie w DOM światła

  • Można dodać element otoki wokół <div #wrapper><ng-content><ng-content><div> następnie można uzyskać elementy z „szarej DOM”

+1

Nie używając "ViewEncapsulation.Native" oznacza, że ​​jestem ograniczony do przeglądarek, które implementują shadow DOM? Buduję bibliotekę wielokrotnego użytku i potrzebuję jak największego wsparcia. Poza tym - tak, działa tak, jak mówisz. –

+0

Tak, trzeba dodać składniki do składni komponentów internetowych w przeglądarkach, które nie obsługują ich natywnie. Czy podejście opakowania również działa? Można utworzyć żądanie funkcji w repozytorium kątowym, aby dodać obsługę kwerend dotyczących treści potomnych z elementu 'ng-content'. –

+0

@Guenter - Ok, to sprawia, że ​​pierwsza opcja jest bez wyjścia Obawiam się. Nie można uzyskać działania opakowania. Dodałem trochę więcej informacji do pytania, aby wyjaśnić przypadek użycia. Myślę, że ponieważ mam 'ngIf' na moim" niestandardowym "opakowaniu szablonów, to po prostu pojawia się jako' 'przy próbie sprawdzenia jego zawartości oraz' ContentChildren ('wrapper')) 'daje' null'. Myślę, że kwestia kątowości/kątowości jest prawdopodobnie drogą do zrobienia. –

Powiązane problemy