我的控制器中有这段代码..
controller('ChallengeCtrl',function($scope,$http){
$scope.challenged = [];
$scope.checkVideo = function (video) {
var response;
console.log(url);
return $http.get(url).success(function(data) {
return data;
}).error(function(data){
return data;
});
}
$scope.challengeMe = function() {
$scope.checkVideo($scope.selectedVideo).then(function(data){
$scope.challenged = data.data;
console.log($scope.challenged); //working
});
}
$scope.printChallenge = function() {
console.log($scope.challenged); //not working, returns [] null
}
});
当我调用$scope.challenged
函数时,我分配了challengeMe()
的值,我尝试在我的$scope.challenged
函数中控制printChallenge()
数组中的值,但它返回到是空的。
答案 0 :(得分:1)
假设您在页面加载时调用challengeMe()
和printChallenge()
,问题就出现了,因为challengeMe()
有一个异步函数调用,它填充$scope.challenged
中的数据。当异步调用正在进行时,您正在执行您的函数,即printChallenge()
没有时间延迟,并且由于challengeMe()
中的调用尚未完成,因此$scope.challenged
未填充任何数据。
要解决此问题,您可以添加$timeout
,也可以按照challengeMe()
答案 1 :(得分:0)
由于ChallengeMe()是异步函数,因此在调用PrintChallenge()方法之前需要一个计时器函数,以便等到数据填充(这是一种错误的方法,因为我们通常不知道我们将在多长时间内填充数据)或者您可以在ChallengeMe()调用之后和PrintChallenge()调用之前有一个WHILE循环。在WHILE循环中,您可以检查$ scope.challenged是否为NULL。
在ChallengeMe()方法内的.then内的控制台消息可以工作,因为.then仅在AJAX调用完成后执行。但此时执行必须进一步转移到PrintChallenge()方法而不等待数据,因此PrintChallenge()调用内的控制台消息没有任何内容。