我有一个控制器。这是构造函数的相关部分(这个函数的正确术语是什么?):
activate();
function activate() {
$scope.$broadcast('ctrlLoadingStarted');
var promises = [getUsers()];
return $q.all(promises).then(function (eventArgs) {
$scope.$broadcast('ctrlLoadingFinished');
});
}
因此,activate函数基本上是一个通用函数,它接收一组数据获取函数。它在开始时播出并在播出时播出。
然后我有一个嵌套在控制器范围内的指令,这是指令的相关部分:
function link(scope, element, attrs) {
scope.$on('ctrlLoadingStarted', function (event, args) {
scope.spinnerOn = true;
});
scope.$on('ctrlLoadingFinished', function (event, args) {
scope.spinnerOn = false;
});
}
正如您所看到的,它只是听取开始和结束事件并打开和关闭微调器。
问题是控制器似乎在指令之前进行实例化。这导致广播消失,而不是打开微调器。
我试着简单地将scope.spinnerOn = true;
放在指令的第一行(这样,无论何时控制器相对于指令实例化进行实例化,微调器总是会继续)。然而,我遇到的问题是控制器的第二次广播将在指令被实例化之前熄灭,从而导致无限的旋转器。
我只想确保如果控制器在指令之前实例化,那么数据获取需要一段时间,微调器将旋转。
感谢所有建议,提前谢谢。
答案 0 :(得分:2)
在$ timeout中触发激活功能。
function activate() {
$scope.$broadcast('ctrlLoadingStarted');
var promises = [getUsers()];
return $q.all(promises).then(function (eventArgs) {
$scope.$broadcast('ctrlLoadingFinished');
});
}
$timeout(activate)
使用此功能,将在下一个摘要周期中调用activate函数。
有关摘要周期Integration with the browser event loop
部分的详情,请参见:https://docs.angularjs.org/guide/scope
免责声明:这是我对Javascript /浏览器如何工作的理解。这可能不正确。