将新值推送到数组仍然返回空 - AngularJS

时间:2015-07-10 04:33:03

标签: javascript angularjs

我的控制器中有这段代码..

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()数组中的值,但它返回到是空的。

2 个答案:

答案 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()调用内的控制台消息没有任何内容。