のは、私はコンポーネントがあるとしましょう:Angular2 - ゲット成分光DOMのinnerHTML /子ノード
@Component({
selector: 'foo',
template: '<div>foo</div>'
})
export class Foo {}
をそして私はこのような別のコンポーネントでそれを消費:
<foo>
<h1>some inner HTML</h1>
</foo>
がどのように見つけることができますFoo
にlight DOMの子要素がある場合
私は<h1>some inner HTML</h1>
のaholdを取得したいと思います。
オプション1 - @ContentChildren()
:これは任意の要素を照会するためには使用できません。現在、角2のコンポーネントまたは変数(#foo
)のみがこの方法で照会されます。私がそれを避けることができれば、内側の要素に変数を付ける必要はありません。
オプション2からelementRef.nativeElement
:私はFoo
成分にElementRef
を注入することができるが、成分(コンストラクタで)インスタンス化された時点で、内側の要素が既に除去されて、それが空になります。ライフサイクルの後半(例えば、ngAfterViewInit()
)、内部要素はシャドウDOM(つまり<div>foo</div>
)になります。
私が紛失している方法はありますか?ユースケース
が、私はこれをしたい理由について、いくつかのコンテキストを与えるために、私は、ユーザーが決定した場合は、カスタムテンプレートに置き換えることができるデフォルトのテンプレートを、持っているライブラリコンポーネントを作成しています。だから私のデフォルトのテンプレートは次のようになります。
<div *ngIf="hasTemplate"><ng-content></ng-content></div>
<div *ngIf="!hasTemplate"><!-- the default template --></div>
は私が<foo>..</foo>
タグ内のHTMLがある場合true
にhasTemplate
を設定するには、いくつかの方法が必要です。
'ViewEncapsulation.Native'を使用しないと、シャドウDOMを実装しているブラウザに限定されていますか?私は再利用可能なライブラリを構築しており、可能な限り幅広いサポートが必要です。それ以外 - はい、それはあなたが言うように動作します。 –
はい、それをネイティブにサポートしていないブラウザにWebコンポーネントのポリフィルを追加する必要があります。ラッパーのアプローチも同様に機能しますか? Angularリポジトリに機能要求を作成して、 'ng-content'要素からコンテンツの子を照会するためのサポートを追加することができます。 –
@Guenter - それでは、最初のオプションは何も起こらない、私は恐れている。ラッパーのアプローチを働かせることはできません。私は、そのユースケースを明確にするために質問にいくつかの情報を追加しました。私は自分の "カスタム"テンプレートラッパーに 'ngIf'を持っているので、内容を調べようとすると' <! - template bindings = {} - > 'と表示され、' ContentChildren( 'wrapper' ) 'が返されます。 角度/角度の問題は、おそらく行く方法だと思います。 –