这是一个范围问题。这是我的理解。
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;
}
};
});