这是一个范围问题。这是我的理解。
foo=1 时的作用域链
- MyCtrl 的作用域 <- 我们在这里捕获
- ngSwitch 的 foo="1" 范围
- myDirective 的作用域 <- 我们在这里发出
 
 
 
作用域链是完整的,我们可以毫无问题地捕获发出的事件。
当 foo=2 时作用域链发生变化
- MyCtrl 的作用域
- null <- 被销毁并设置为 null 以进行内存管理。
 
 
范围链不再完整。发出的事件不会传播到 myDirective 清理的父范围之外。此清理可能是作为 1.0.4 中的功能添加的。
这是我对问题的解决方案。我使用 fileLoader 服务在指令和控制器之间共享状态。http://jsfiddle.net/apBZX/
var myApp = angular.module("myApp", [])
myApp.controller('MyCtrl', function ($scope, $rootScope, fileLoader) {
    $scope.$watch(function () {
        return fileLoader.numberOfloadedFiles;
    }, function (numberOfLoadedFiles) {
        $scope.numberOfLoadedFiles = numberOfLoadedFiles;
    });
    $scope.foo = 1;
});
myApp.directive("myDirective", function (fileLoader) {
    return {
        restrict: 'A',
        replace: true,
        scope: {},
        template: '<div>I am the directive</div>',
        link: function (scope, element, attrs) {
            if (!fileLoader.isLoading) {
                fileLoader.loadFiles(scope);
            }
        }
    }
});
myApp.service("fileLoader", function () {
    return {
        numberOfloadedFiles: 0,
        isLoading: false,
        loadFiles: function (scope) {
            var self = this;
            setInterval(function () {
                scope.$apply(function(){
                    self.numberOfloadedFiles++;
                });
            }, 1000);
            self.isLoading = true;
        }
    };
});