2016-11-25 5 views
0

ドキュメントには、コンポーネントの削除機能を使用して、追加したイベントリスナーを削除できることが記載されています。私はいつもこれを必要としますか?または、エンティティが削除されたときにイベントが削除されますか?コンポーネントでremoveEventListenerを呼び出す必要があるのはいつですか?

他のエンティティで追加したイベントを削除する必要があることを理解します。しかし、コンポーネントがそのエンティティにクリックイベントを追加する場合。エンティティが削除されると、そのクリックイベントは削除されますか?それとも、メモリリークの原因になりますか?

乾杯

ピーター

ここで考慮すべき
+0

あなたはそれをテストできるはずです。イベントハンドラでログを出力し、エンティティを削除してイベントを発生させます。 – lupz

+0

合意しましたが、エンティティがなくなるとトリガーできるイベントは発生しませんでした。クリック、ホバーなどは動作しません。 – Peterd

答えて

1

三例:

  1. を(・フレームの<a-entity/>のような)DOM要素が切り離され、そしてあなたがへの参照を格納しない場合どこの変数にも要素がある場合、イベントリスナーのバインドを解除する必要はありません - the listeners are cleaned up automatically

  2. remove()でリスナーを削除して、次回のinit()が実行されるようにするには、重複イベントの受信を開始しないでください。

  3. 最後のケース、そしておそらく最も重要な、あなたのコンポーネントが自社以外の要素にリスナーを結合する場合ということです(canvasdocument、または例えばbody)その後、あなたは間違いなくなるよう、あなたのリスナーをクリーンアップしますシーン内にもう存在しないコンポーネントのコールバックは起動しません。

+0

ありがとう、これは私が期待したものでした。私は(2)をテストする必要がありますが。一種の矛盾(1)。エンティティが削除されると、(エンティティ上の)イベントリスナをクリアする必要があります。したがって、(1)によれば、エンティティへの外部参照があっても、リスナーをクリアする必要があります。後でテスト結果を掲載します。 – Peterd

+0

これを行う: 'el.remove(); cache.el = el; 'ブラウザはイベントリスナーを自動的にクリーンアップしません。その要素がDOMに再接続され、 'init()'がイベントリスナーを再度バインドすると、リスナーが重複します。あなたのJSが 'el'へのすべての参照を破棄した場合、ブラウザはイベントリスナーをクリーンアップします(とにかく' el'を再接続することは不可能です)。 –

関連する問題