次のユース ケースがあります。コンテキストに応じて異なるコンテンツを配置するダイアログ サービスを提供します。サービス メソッドでは、dom 要素を手動でコンパイルし、それを使用して jquery ui を使用してダイアログを表示します。コードは次のとおりです。
var _view = jQuery('<div id="config-dialog"><span ng-include="\'' + $scope.configView + '\'" ng-controller="' + $scope.configController + '"></span></div>');
var _compiled = $compile(_view.contents())($scope);
そして、コントローラーで定義されたスコープ関数によって処理されるスコープ イベントを発生させます。
$scope.$broadcast('config-open', $scope.config);
次に、ダイアログを開き、ユーザーが何かを実行してダイアログを閉じます。ダイアログが閉じたら、DOM から「config-dialog」要素を削除します。このような:
$(this).dialog("destroy");
jQuery('#config-dialog').remove();
ただし、次回ダイアログが開かれ、新しいコントローラーがインスタンス化されると、「config-open」が 2 回処理され、ダイアログを再度開くと 3 回処理されることがわかります。つまり、動的に作成した ng-include にアタッチされたスコープは破棄されません。私は Batarang でデバッグしましたが、ng-include によって作成された子スコープが実際には消去されていないことがわかりました。AFAIK AngularJSスコープはdom要素に関連付けられており、要素を削除すると、スコープはガベージコレクションされるはずですが、これは起こりません。私の質問は - 私の場合、AngularJS はスコープをクリーンアップすることになっています。私のユースケースを実装するためのより適切な方法はありますか?