2017-03-03 9 views
4

別のコンポーネント(Comp)を含むコンポーネント(App)があります。 Appは、データベースから文字列コンテンツを取得し、@Input()Compに転送します。この文字列の内容は、このコンテンツをレンダリングすることになっていると、いくつかのイベントリスナーを追加することになっているCompAngular2:子コンポーネントのViewChildへの参照を取得する方法

Some text before <a>Click</a> Some Text after 

のようなHTMLタグを含めることができます。そのため、このコンテンツは[innerHtml]を使用して追加されます。 [innerHtml]では(click)が削除されているので、aタグへの参照が必要であり、イベントリスナーはaddEventListenerで追加されるはずです。しかし、コンポーネントにElementRefにはnativeElementが含まれていないため、aタグを参照する方法が見つかりません。

このプランナーを実行するにはどのような方法が最適ですか? https://plnkr.co/edit/xVUu0LJ02YVnBO25Zr4j?p=preview

答えて

1

直接DOMアクセスはd Angular2で推奨されています

ここでは、ダイレクトアクセスでハッキングする方法があります。

は、子コンプでイベントリスナーを定義し、イベントをフィルタリング:

document.querySelector('body').addEventListener('click', function(event) { 
     if (event.target.tagName.toLowerCase() === 'a') { 
     that.updateCounter.next(true); 
     } 
    }); 

、カウンタを更新するために、EventEmitterを使用しています。

plunker:https://plnkr.co/edit/vm44niH781j4mEQHDpLU?p=preview

0

Angular2では、ネストされたコンポーネントが直接の親子にしか通信しないようにしたいとします。

コンポーネント "Comp"の "a"タグのクリックハンドラを作成できます。コンポーネントのコンプで

、あなたがメインのアプリコンポーネントでは、あなたのクリックハンドラ

に発火すること、@output()変数(基本的に持つEventEmitter)を作成することができ、あなたの新しい持つEventEmitterに耳を傾けることができ、イベントを処理します。例えば

:コンプで

:アプリケーションのコンポーネントで

@Output myClickEventEmitter: EventEmitter 

aTagClickHandler (e) { 
    myClickEventEmitter.emit(e) 
} 
アプリテンプレートで

myCompClickHandler(e) { 
    console.log(e); 
} 

私は私の構文が正しい時間であると思いますそれは助けとなった。

EDIT:

あなたはまた、そのようなあなたのタグで#variableName属性を使用して、内部コンポーネントを参照することができる必要があります:テンプレートで

:コンポーネントで

<a #variableName > </a> 

@ViewChild('variableName') myATag; 
+0

私が言ったように、コンテンツは外部のデータベースから来ています。私は 'a'タグを編集できません。イベント処理は非常に汎用的で、コンポーネントの使用場所に依存します。そのため、イベントは「アプリケーション」から来て、Compからではないことが必要です。 –

+0

あなたの要件を誤解して申し訳ありません。あなたは@echonaxの答えを見ることができますが、彼が言ったように、 "Angular2で直接DOMへのアクセスは(強く)推奨されていません"。コードの「清潔さ」のためだけでなく、パフォーマンスや副作用の問題についても。たぶんあなたの文字列が十分に規則的であれば、htmlを書き直すことができますか?それに値するかもしれません。 – Pac0

+0

このプロジェクトでは直接DOMへのアクセスも強く推奨されていないため、別の方法を見つける必要があります。現在、私は親コンポーネントにビューを公開しようとしています。 –

関連する問題