$ rootScope。$ on事件监听器函数不改变变量值

时间:2016-04-12 12:40:07

标签: javascript angularjs angularjs-scope

我在控制器中使用$ rootScope。$ on来侦听我正在使用的模块发出的事件(angular-packery)。它的工作原理是它得到了事件&我可以在' args'上执行任务。但我想要做的是将args对象放入在侦听器函数范围之外声明的对象变量中。我无法使用以下代码:

(function() {
    'use strict';
    angular
        .module('app')
        .controller('searchSpeakersResultsCtrl', searchSpeakersResultsCtrl);

        searchSpeakersResultsCtrl.$inject = ['$rootScope', '$scope'];
        function searchSpeakersResultsCtrl($rootScope, $scope) {
            var vm = $scope;


            var pckry = {};
            var packeryEventListener = function (event, args) {
                pckry = args;
                console.log(pckry);
            }

            var unbind = $rootScope.$on('packeryInstantiated', packeryEventListener);
            console.log(pckry);
            vm.$on('$destroy', unbind);

        }
})();

侦听器函数中的console.log给出了正确的值,函数外部的console.log给出了使用var pckry = {};创建的空对象。

但是,正如预期的那样,直接使用packeryEventListener函数(不是从$ rootScope。$ on调用)确实更新了packeryEventListener函数之外的pckry值。

我能错过什么?看起来像基本的Javascript变量范围的东西在与$ rootScope。$ on一起使用时不起作用。干杯,H。

2 个答案:

答案 0 :(得分:0)

是的,尝试在$ scope中保存值,然后看看,比如

(function() {
'use strict';
angular
    .module('app')
    .controller('searchSpeakersResultsCtrl', searchSpeakersResultsCtrl);

    searchSpeakersResultsCtrl.$inject = ['$rootScope', '$scope'];
    function searchSpeakersResultsCtrl($rootScope, $scope) {
        var vm = $scope;


        var pckry = {};
        var packeryEventListener = function (event, args) {
            $scope.pckry = args;
            console.log($scope.pckry);
        }

        var unbind = $rootScope.$on('packeryInstantiated', packeryEventListener);
        console.log($scope.pckry);
        vm.$on('$destroy', unbind);

    }
})();

答案 1 :(得分:0)

这里的问题只是时间问题之一:在回调填充变量之前触发了看到空对象的console.log。请记住,angular是一个非常异步的环境:回调总是比你想象的要晚。

$timeout()中包装代码可能就足够了,但一般来说,您希望确保在异步部分完成之前,使用异步的代码无法运行。这通常意味着启动异步进程的东西应该返回一个promise。通过承诺,您可以在他们解决.then()或拒绝.catch()时运行某些内容,或者您​​可以通过$q.all()等多种方式将它们合并,等待完成多项工作。

请注意,$timeout$http也会返回承诺。

此外,一旦你有了一个承诺,即使它在几周前解决了,你也总是可以使用thePromise.then(function() {...})作为守卫在承诺解决后运行一些代码。 (并且记住,即使promise已经解决了,回调仍然是异步调用的,所以直到你的其他代码返回为止。)