2017-02-09 5 views
4

私はこのようになりますAngularJSディレクティブが見つかりました:

function MyDirective() { 
    return { 
     restrict: 'A', 
     link: function(scope, elem) { 
      elem.on('click', function() { 
       // do stuff 
      }); 
      scope.$on('$destroy', function() { 
       elem.off('click'); 
      }); 
     } 
    }; 
} 

私は、次の部分が特に心配している:

elem.off('click'); 

scope.$destroy後の要素が使用されないことを前提とすることは安全ですこの特定の指令だけでなく、すべてのリスナーをクリアすることができます。

+1

通常の状況では、これは安全で無駄です。 –

+0

@PetrAveryanov明確にするための答えを追加しました。 – estus

答えて

1

それは、イベントを購読解除する要素によって異なります。 IMHO イベントの登録を解除するときは、常に慎重にしてください。 clickイベントを間違って辞退してプロジェクトに微妙なバグを導入し、私に悲惨さを感じさせるプロジェクトを覚えています。あなたの場合、あなたの指示は小さくて清潔です。それはスコープが破壊されるのですとき大安が強調されているように

function MyDirective() { 
    return { 
     restrict: 'A', 
     link: function(scope, elem) { 
      elem.on('click', function() { 
       // do stuff 
      }); 
      scope.$on('$destroy', function() { 
       elem.off('click'); 
      }); 
     } 
    }; 
} 

ので、要素は、それらが破壊されたときにスコープと要素に登録リスナーが自動的にクリーンアップされ、すべてのビューに存在するとしませんので、我々は必要登録されたリスナーについて気にする必要はありません。エレメントが再作成されるとすぐに、リスナーは、あなたのケースではclickのエレメントに再び登録されます。それはに基づいているもののについてnamespacingを話し

//Subscribing 
angular.element("#element") 
    .on("click.myNamespace", function() { 
    console.log("doSomething"); 
    }); 
//Unsubscribing 
$("#element").off("click.myNamespace"); 

Here's CSSのトリックの記事:しかし、あなたはちょうどあなたがすべてのリスナー、あなたはあなたのイベントをnamespaceし、それらを購読して解除することができますしていない登録済みリスナーを削除するシナリオが存在する場合jQueryの概念は同じです。

2

スコープ破壊 - 子スコープが不要になったとき、 スコープを経由してそれらを破壊するために、子のスコープの作成者の 責任ではありません$破壊()API。これは、 $ digest呼び出しの子スコープへの伝播を停止し、 子スコープモデルで使用されるメモリをガベージコレクタによって再利用できるようにするために行われます。それらが破壊されたときにスコープと要素に登録

リスナーは を自動的にクリーンアップされますが、 サービスにリスナーを登録、または は削除されていないDOMノード上のリスナーを登録した場合、あなた'LLあなた自身でそれをきれいにするか、または メモリリークを導入する危険性があります。 angular.element https://docs.angularjs.org/api/ng/function/angular.element

スコープ破壊は既にイベント破壊の世話をするについて

より多くの情報が利用可能AngularJS directivesを通して添加(例えばng-click/`NG-change'/....)

ng-...ディレクティブを使用すると自動的に破壊されます。カスタムイベント/リスナーを使用する場合は、$destroyイベントで手動で削除してください。

はい私は、scopeがとにかく破棄されているので、すべてのディレクティブ(アプリケーションスコープのハンドラではない)ハンドラをアンバインドしても安全だと述べます。あなたの要素はdestroyedであるスコープ(ng-controller)に属しているので、それ以上は必要ありません。実際にはAngularがあなたのためにもっと深いことをしています...

+0

これは具体的な質問には答えません。すべての**ハンドラを要素から除外することは安全ですか、またはこの特定の指令セットだけを明示的に購読解除する必要がありますか? – Impworks

+0

Allright、明示的に述べられた更新された答えを見てください:)。 –

+0

ありがとう、今は明らかです。 – Impworks

関連する問題