2016-02-28 22 views
5

Diciamo che ho un componente:Angular2 - Get luce componente DOM innerHTML nodi/figlio

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

E che consumo in un altro componente in questo modo:

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

Come posso sapere se Foo ha qualche elemento figlio nel DOM luce?

Voglio ottenere <h1>some inner HTML</h1>.

Opzione 1 - @ContentChildren(): Questo non può essere usato per interrogare elementi arbitrari; attualmente solo le componenti o le variabili Angular 2 (#foo) possono essere interrogate in questo modo. Non voglio dover associare una variabile agli elementi interni se posso evitarlo.

Opzione 2 - elementRef.nativeElement: posso iniettare ElementRef nel componente Foo, ma dal momento in cui il componente è istanziato (nel costruttore), sono già stati rimossi gli elementi interni, e sarà vuoto. Più avanti nel ciclo di vita (ad esempio ngAfterViewInit()) gli elementi interni saranno solo il DOM ombra (ad esempio <div>foo</div>).

Altri metodi che mi mancano?

Use Case

di dare qualche contesto su questo che voglio fare questo, sto creando un componente di libreria che ha un modello predefinito, che può essere sostituito da un modello personalizzato se l'utente decide. Quindi il mio modello predefinito si presenta così:

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

ho bisogno di qualche modo per impostare hasTemplate a true se c'è HTML all'interno dei <foo>..</foo> tag.

risposta

4
  • È possibile passare alla encapsulation: ViewEncapsulation.Native poi il contenuto sarà alla luce DOM

  • è possibile aggiungere un elemento wrapper <div #wrapper><ng-content><ng-content><div> allora si può ottenere gli elementi della "DOM ombra"

+1

Non utilizza 'ViewEncapsulation.Native' significa che sono limitato ai browser che implementano DOM ombra? Sto costruendo una biblioteca riutilizzabile e ho bisogno del supporto più ampio possibile. A parte questo, sì, funziona come dici tu. –

+0

Sì, è necessario aggiungere i polyfill dei componenti Web sui browser che non lo supportano in modo nativo. Anche l'approccio wrapper funziona? È possibile creare una richiesta di funzionalità nel repository Angular per aggiungere il supporto per l'interrogazione di contenuto secondario dall'elemento 'ng-content'. –

+0

@Guenter - Ok, questo rende la prima opzione un no-go, ho paura. Non riesco a far funzionare l'approccio wrapper. Ho aggiunto qualche altra informazione alla domanda per chiarire il mio caso d'uso. Penso che dal momento che ho un 'ngIf' sul mio wrapper di template" custom ", appare come' 'quando provo a ispezionare il suo contenuto, e' ContentChildren ('wrapper') 'yields' null'. Penso che un problema angolare/angolare sia probabilmente la strada da percorrere. –

Problemi correlati