2016-12-23 6 views
2

構造ディレクティブを使用すると、ディレクティブが存在する(ネイティブ)要素をどのように保持できますか?通常のディレクティブで は、ElementRefはそれを指してnativeElementのしている - 例えば:構造ディレクティブ - 配置されている要素を見つける

<input type="text" example> 

@Directive({ 
    selector: '[example]' 
}) 
export class ExampleDirective {  

    constructor(private el: ElementRef) {} 

    ngAfterViewInit() { 
    console.log(this.el.nativeElement); // the input 
    } 
} 

しかし、構造的ディレクティブで、それはテンプレートのコメントを指す - など。私はViewContainerRef、TemplateRef、@ContentChild、@ViewChildの様々な組み合わせを使用してみました

<input type="text" *example> 

@Directive({ 
    selector: '[example]' 
}) 
export class ExampleDirective { 

    constructor(
    private el: ElementRef, 
    private view: ViewContainerRef, 
    private template: TemplateRef<any> 
) {} 

    ngAfterViewInit() { 
    this.view.createEmbeddedView(this.template); 

    console.log(this.el.nativeElement); // template bindings comment 
    // how to find the input itself? 
    } 
} 

- ちょうど入力要素自体を見つけることができるようには見えません...

+0

実際に解決しようとしている問題は何ですか? –

答えて

3

全ての構造ディレクティブがあります<template>要素に追加されました。 Angularは、<template>要素をDOMに追加することはありません。したがって、構造ディレクティブが追加された要素を取得することはできません。

あなたは

<template [ngIf]="..."> 
    <div></div> 
</template> 

を作成し、<template>が追加されていないので、そこを取得する手立てがなく、<div>ための要素ではありません*角度

<div *ngIf="..."></div> 

などで速記構文を使用している場合構造ディレクティブが追加され、ディレクティブ参照を使用してこの要素を取得することもできません。 Structural Directives Documentation(それが動作するかどうか確認してください、多分あなたが助けていない)に基づいて

+0

ありがとうございましたGunter - 私はこれが悲しいケースであると考え始めました。私は角度がどのように構造ディレクティブをテンプレートに展開するかについて知っていますが、私はちょうど使用された要素に利用可能な参照がまだあると思っていました。オーバーサイトのようだ。 私はinput要素(TemplateRefのnextSiblingの下)を見ることができますが、良いgettableの方法では何もありません。 –

+0

実際の問題が解決しようとしていることを少し詳しく説明すれば、いくつかの代替アプローチが明らかになるかもしれません。 –

-1

<input type="text" *example> 


@Directive({ 
    selector: '[example]' 
}) 
export class ExampleDirective { 

    constructor(private viewContainer: ViewContainerRef) { } 

    @Input() set example() { 
    console.log(this.viewContainer.element.nativeElement.value); 
    } 
} 
+0

ありがとう@lennyしかし、私はこの方法を試してみました - それが動作することを期待していますが、あなたはthis.inputのために未定義を得るでしょう - したがって、nativeElementは利用できません。 –

+0

@CalvJ申し訳ありませんが私の以前の答えは間違っていた。私は**更新しました**、それが動作するかどうかは分かりませんが、おそらくあなたを助けます。 – lenny

+0

:-)もう一度ありがとう - しかし、(this.viewContainer.element.nativeElement)はまだあなたのコメントをつかむだけです!多分、ガンターは正しいと思うし、それを手に入れる直接的な方法はないと思う。 –

0

これはかなりありませんが、私の仕事:

this.viewContainer.get(0).rootNodes[0] 

私はときにそれを使用*ngIfディレクティブのバージョンを実装しましたが、アニメーションはanimatedIfです。

関連する問題