我在控制器中使用$ 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。
答案 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已经解决了,回调仍然是异步调用的,所以直到你的其他代码返回为止。)