我有一个由 fancybox 触发的模式窗口。当模态显示时,fancybox 会广播一个 AppController 监听的“modalShown”事件。在该侦听器中,AppController 对模态窗口的内容调用 $compile,以便在视图上创建 ModalController、插值和绑定事件。
我的问题是,当我关闭模式时,模式元素会从 DOM 中删除,但其绑定的 ModalController 实例仍在某处。所以每次我打开一个新窗口时,我都会创建一个新控制器,所有这些孤立的控制器都在响应模态窗口内的事件。
我的问题是,由于 $compile 创建了新的控制器,但没有返回对它的引用,我如何清理这些在我的应用程序中传播的未使用的控制器?
相关代码(咖啡)...
Fancybox 指令
# sets up the fancybox on each element that triggers the modal...
# <a href="#" fancybox="templateToLoad.html">Trigger Modal</a>
@app.directive 'fancybox', ["$templateCache", "$compile", ($templateCache, $compile) ->
(scope, element, attrs) ->
options =
afterShow : ->
scope.$root.$broadcast 'modalShown', scope
element.fancybox options
模态的.html
<div class="fancybox-skin">
<div class="fancybox-outer">
<div class="fancybox-inner ng-scope">
<div ng-controller="ModalController" style="..." class="ng-scope">
<a href="#" ng-click="someAction()">Some Action in ModalController</a>
</div>
</div>
</div>
</div>
模态控制器
app.controller 'ModalController', [
'$scope', '$rootScope',($scope, $rootScope) ->
# keeping track of controllers for debugging
window.globalCounter ||= 0
$scope.localCounter = window.globalCounter++
someAction = () ->
console.log 'action'
应用控制器
@app.controller "AppController", [
"$scope", "$rootScope", "$compile", ($scope, $rootScope, $compile) ->
$scope.$on 'modalShown', (e, localScope) ->
console.log('compiling modal contents')
$compile($('.fancybox-inner'))(localScope)
$rootScope.$apply()