誰かが私にそのデタッチリストとは何かを説明できますか?これはWebで頻繁に見つかります「既存の親ウィジェットを持つウィジェットはデタッチリストに追加されない可能性があります」。説明や背景情報は見つかりませんでした。エラーメッセージだけが見つかりました。ありがとう!
2 に答える
メモリリークの軽減の一環として(IEで必要とされるだけではないにしても、ほとんどの場合)、GWTにはアタッチおよびデタッチされたウィジェットの概念があります。ウィジェットを子として別のアタッチされたウィジェットに追加するたびに、子ウィジェットとそのすべての子ウィジェットもアタッチされ、アタッチされた親からウィジェットを削除すると相互にアタッチされ、すべての子とともにデタッチされます。ウィジェットを切り離すと、メモリリークを引き起こす可能性のあるすべてのリソースが解放されます。
上記はアタッチされたウィジェットのツリーを構築しますが、ツリーにはルートが必要です。このようなルートアタッチされたウィジェットには、次の2種類があります。:RootPanel
は常にアタッチされwrap()
、既存のDOM要素にpingを実行して作成されたウィジェットも自動的にアタッチされます。
ページがアンロードされると、GWTはメモリリークを回避するためにすべてのウィジェットを必ず切り離します。そのために、デタッチリストと呼ばれるルートに接続されたウィジェットを追跡し、ルートウィジェットであるはずのウィジェットが実際にルートであることを確認します(つまり、それらの要素が別のウィジェットのDOMサブツリーに含まれていません)。このルールの唯一の例外は、他のすべてのウィジェットが存在するドキュメントのを表すためです。RootPanel.get()
<body>
デタッチリストは、ページがアンロードされたときにデタッチされるウィジェットのリストです(ソース、ソースの1つだけを推測します)。
基本的に(以下は完全な説明ではありません。公式のグーグルドキュメントを読んでも構わないと思っているなら、GWTは非常によく文書化されています)、GWTでウィジェットを作成すると、そのウィジェットはRootPanelに追加されるまで表示されません。 RootPanelに接続されている任意のウィジェット(その親になります)。ウィジェットをRootPanelから切り離す操作(前にリンクとして指摘した操作など)があります。RootPanel.detachNow(widget)
ただし、親ウィジェットに埋め込まれているウィジェットを呼び出すことはできません。そのような呼び出しはあなたが求めている例外を引き起こします。