【问题标题】:Angular spinning directive gets instantiated after controller load角旋转指令在控制器加载后被实例化
【发布时间】:2015-02-25 12:35:03
【问题描述】:

我有一个控制器。这是构造函数的相关部分(这个函数的正确术语是什么?):

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; 放在指令的第一行(这样,无论控制器何时相对于指令实例化进行实例化,微调器都会一直运行)。但是,我遇到的问题是控制器的第二次广播会在指令被实例化之前就发出,从而导致无限的微调。

我只是想确保如果控制器在指令之前实例化,但是数据获取需要一段时间,微调器将旋转。

感谢所有建议,提前致谢。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    在$timeout中触发activate函数。

    function activate() {
                $scope.$broadcast('ctrlLoadingStarted');
                    var promises = [getUsers()];
                    return $q.all(promises).then(function (eventArgs) {
                        $scope.$broadcast('ctrlLoadingFinished');
                });
            }
    
    $timeout(activate)
    

    这样,激活函数将在下一个摘要循环中被调用。

    更多关于摘要循环Integration with the browser event loop 部分:https://docs.angularjs.org/guide/scope

    免责声明:这是我对 Javascript/浏览器工作原理的理解。可能不正确。

    【讨论】:

    • 我认为我需要用 $timeout 作为第二个参数来指定一个时间? $timeout 在没有超时规范的情况下会做什么?你能扩展“下一个消化周期”吗?第一个摘要循环实例化所有对象?角度加载时是否总是有第二个摘要循环,或者它只发生在例如超时的情况下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多