Angular2 RC1 Webアプリケーション内で外部から変更されたDOMに関する助けが必要です。シナリオは単純です:私はこのAngular2、ZoneJS、外部で変更されたDOM
<div id="my-svg-canvas"></div>
typescriptedコンポーネントのようなIDと空のdivが含ま応じたテンプレートを持つコンポーネントを持っている含まれているプレーンなJSファイルから関数をトリガーngOnInitメソッドを持っていますindex.htmlのscript-tagを介してこの関数はSVGを上記の "div"タグに表示します。 SVGには、コンポーネント内のいくつかのメソッドを参照するオン・クリック・ディレクティブを含むいくつかのa要素が含まれています。
これは、SVGが完全に書かれた後、$ scope。$ apply()を呼び出した後、Angular1でうまくいきました。今、Angular2では、私のコンポーネント内のそれぞれのメソッドがトリガされません。
私は知っている、ZoneJSは今DOMの変更を検出する責任があります。私はこれがAngular-managedコンポーネントの内部でレンダリングされたDOM全体に対して自動的に行われることを期待していました。次の試みは、このように、私のコンポーネントでNgZoneを注入し、明示的にその中のレンダリング機能を実行することでした:
ngOnInit() {
this.ngZone.run(() => {renderSVG(this.myData, "my-svg-canvas");})
}
ません成功のいずれか: - :問題以来、/また、私はMutationObserver(Angular2 Directive: How to detect DOM changesこのスレッドを参照してください)に登録私と少し似ていました。しかし、どちらも解雇されていません。
私はどこを探すべきかわかりません。
注:SVGレンダリングフレームワークが無効な属性の設定を拒否したため、「(クリック)」ではなく「オンクリック」を使用する必要がありました。明らかに、括弧で始まる属性はHTMLでは問題ありませんが、XMLでは正しくありません。しかし、両方の指令が完全に交換可能であるため、これは問題ではありません。
PS:
と呼ばれるレンダリング方法がSVG.jsフレームワークを利用し、次のようになります。
function renderSVG(dataParam, elementIdParam) {
draw = SVG(elementIdParam).spof();
initAndPaint(draw, dataParam);
return draw;
}
そして
<a id="SvgjsA1033" on-click="showVal('W1')" class="union">
libにSVG.jsによって生成されたタグ
生成されたSVGコードをテンプレートに貼り付けると、すべて正常に動作します。
最初のリンクで提供されている解決策は、本当に私にうんざりを与えています:-) 私はDynamicLoaderComponentにチャンスを与えてくれました。実際には動作しますが、Angular1の1ライナーと比較して中世のタイムワープバック。十分に公正で、我々はRCを扱っているが、より良い解決策が提示されるべきである。 – Matt
ありがとうございました!実装にあなたの投稿を追加し、それを "受け入れられました"と – Matt
@ user3802631というフラグを付けました。私は完全に同意します。 DynamicLoaderComponentよりも単純なものが必要です。あなたの編集が拒否されたようです。私は別の答えとしてそれを追加することをお勧めします。 –