javascriptを使用して角度コンポーネントを動的に作成し、新しく作成したスコープで$compile
を使用して角をコンパイルします。その後、私がそのコンポーネントのために使用しなくなったら、コンポーネントと新しいスコープを破壊したい。
新しいスコープを破棄しても、使用されるすべてのメモリが解放されないという事実を除いて、すべてが期待通りに機能します。ここで
は、そのコードの簡易版の一部です:このコードの
app.controller("mainCtrl", ["$scope", "$compile", function($scope, $compile) {
var childScope;
//call this every time the button is clicked
this.createDirective = function() {
//dynamically create a new instance of the custom directive
var customDirective = document.createElement("custom-directive");
//if another child scope exists, destroy it
if (childScope) {
childScope.$destroy();
childScope = undefined;
}
//create a new child scope
childScope = $scope.$new();
//compile the custom directive
$compile(customDirective)(childScope);
};
}]);
全作業の例では、すべてこのコードは、新しいコンポーネント]ボタンがクリックされるたびに作成されないhere
ですすでに存在するコンポーネントはすべて破棄してください。 コンパイルしたコンポーネントを実際にページに追加しているわけではないことに注意してください。なぜなら、使用しているかどうかにかかわらず、リークはまだそこに残っていることに気付いたからです。 ( - >レコード割り当てタイムライン - プロファイル>スタート)Chromeの開発ツールを使用して
私はボタン を数回クリックした後、次のメモリ使用量を参照してください。
任意のメモリを占有することは明らかですスコープの$destroy
関数が呼び出されていても、customDirectiveは実際には解放されません。
新しい範囲を作成せずに$compile
を正常に使用しましたが、このシナリオでは何か不足しているようです。新しいスコープへの参照がないことを確認するために何か他のことをしなければならないのでしょうか?
app.controller("mainCtrl", ["$scope", "$compile", function($scope, $compile) {
var childScope;
//call this every time the button is clicked
this.createDirective = function() {
//dynamically create a new instance of the custom directive
var customDirective = document.createElement("custom-directive");
//if another child scope exists, destroy it
if (childScope) {
childScope.$destroy();
childScope = undefined;
}
//create a new child scope
childScope = $scope.$new();
//compile the custom directive
var compiledElement = $compile(customDirective)(childScope);
//FIX: remove the angular element
childScope.$on("$destroy", function() {
compiledElement.remove();
});
};
}]);
これは実際にはバイブルの例を修正するので、非常に有望なように見えます。私は私のアプリケーションにそれを適用し、それが同様に動作するかどうかを確認します – kapoiosKapou
はい!これは私のより複雑なアプリケーションのためにも動作します.. しかし、私はまだ、なぜこの作品が正しいのか理解していません。私はDOMに追加していないので、なぜそれを削除する必要がありますか? また、コンパイルした要素をDOMに追加して削除しても、メモリはまだ漏れていました。 $ compileはこれを他の場所にも追加していますか?多分キャッシュのように..? – kapoiosKapou