0

我有一个由 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() 
4

1 回答 1

0

你所ModalController拥有的实际上只是一个功能,它运行以设置其相关的任何功能$scope,然后再也不会被看到或听到。$scope.$on('$destroy', function() { ... })您仍然看到剩余的任何功能要么留在此范围内,要么从控制器泄漏,应在一个块中清理。

如果功能在$watches 或$ons 作用域上,那么当作用域被销毁时,它们应该被 angular 自动清理掉。如果它们仍然存在,那么当模式关闭时范围还没有被破坏。

您正在使用自己传递父范围$compile($('.fancybox-inner'))(localScope)。如果不是localScope您使用,那么当您看到模式关闭时,localScope.$new()您将能够安全地调用这个新范围。.$destroy()

顺便说一句,我是否可以建议将AppController功能移动到您的fancybox指令中并完全避免这些广播 - DOM 操作和编译比控制器更适合指令,并且您可以更轻松地跟踪您需要创建的任何新范围。

于 2013-10-10T02:59:22.243 回答