JavaScriptでは、DOMノードを個別に削除することはできません。次のDOMツリーを持っている場合:
div.children
span
は、あなたは、単にdiv.children
からそれを削除する必要があるスパンを「破壊」するには。 span
要素を指すリンクがもうない場合は、ガベージコレクションされます。そして、オブジェクトについても同様です。
角度で次のような構造を想像してみて:
ComponentA.nodes
ComponentBElement -> ComponentBClass
今角度はComponentB
を "破壊" する必要があります。これを行うには、単にComponentBElement
を親のComponentA.nodes
から切り離します。 、今
function execRenderNodeAction(...) {
const renderer = view.renderer;
switch (action) {
...
case RenderNodeAction.RemoveChild:
renderer.removeChild(parentNode, renderNode);
break;
を角度はComponentBElement
またはその子にいくつかのイベントリスナーを追加するとします。あなたはviewContainerRef.clear()
を実行するときに、これは、角度は例えば、何をするかです。
removeEventListners
を明示的に呼び出す必要はありますか? Usually no DOM要素が削除されると、イベントリスナーもガベージコレクションされるためです。ただし、イベントリスナーへの参照が、一部の非同期タスクまたは継続して生きているオブジェクトでキャプチャされる可能性があります。これにより、リスナーとDOMがガベージコレクションされなくなります。したがってAngularは、イベントリスナーが確実に削除されるようにします(v5ではDomEventsPlugin.removeEventListenerメソッド)。角度は、コンポーネントビューを作成するとき
それはlistenToElementOutputs呼び出し:
function listenToElementOutputs(view, compView, def, el) {
for (var i = 0; i < def.outputs.length; i++) {
...
var disposable = listenerView.renderer.listen(listenTarget || el, output.eventName, handleEventClosure));
((view.disposables))[def.outputIndex + i] = disposable; <------
}
}
あなたはそのイベントがrenderer
を用いて取り付けられて見ることができ、次いで、退会コールバック(使い捨て)がview.disposables
に格納されます。角度がビューを破棄すると、これらの消耗が実行され、イベントリスナーが削除されます。:
function [destroyView](view) {
...
if (view.disposables) {
for (var i = 0; i < view.disposables.length; i++) {
view.disposables[i](); <----------------
}
}
ビューとコンパイルの読み取りの詳細については:
ありがとうございましたそれは私のためのビットを明確にするために!また、このプロセス中のある時点で、ビューにバインドされたプロパティが削除されているかどうかもわかりますか? Angularはビュー内のイベントリスナーと同じ方法でこれを追跡しますか? – MrMalt
あなたは大歓迎です、_ビューはビューに束縛されています_どういう意味ですか?あなたは例を見せてもらえますか? –
申し訳ありませんが、それは少し不明でした。例えば。 '
関連する問題