访问angularjs控制器中的局部变量

时间:2016-01-06 21:28:48

标签: javascript angularjs closures

在下面的代码中,

app.controller('Controller', function($scope, $http){

    $scope.rep = [];

    $scope.tot = {
        name: '',
        marketValue: 0,
        cash: 0,
        legend: 'none'
    };


    (function loadData(){
        $http.get('result.json').
            then(function(data) {
                        angular.forEach(data['data'],function(value, key){
                            $scope.rep[key] = value;
                            $scope.rep[key].marketValue    = parseFloat(value.marketValue);
                            $scope.rep[key].cash           = parseFloat(value.cash);
                        });
                    } ,
                     function(data) {
                        console.log("My error: " + data);
                    }
                );
    })(); // IIFE

    for (var i = 0; i < $scope.rep.length; i++) {
        $scope.tot.marketValue += $scope.rep[i].marketValue;
        $scope.tot.cash += $scope.rep[i].cash;
    }
});

$scope.rep是一个局部变量,可以在IIFE的嵌套函数中访问。

IIFE执行后,没有进一步执行,平静终止执行。

控制台没有给出任何错误消息。

为什么for循环不执行?

2 个答案:

答案 0 :(得分:1)

这可能是一个时间问题。也许for循环在$ http.get()返回结果之前执行。在初始化$ scope.rep之后,您是否尝试过执行for循环?

(function loadData(){
    $http.get('result.json').
        then(function(data) {
                    angular.forEach(data['data'],function(value, key){
                        $scope.rep[key] = value;
                        $scope.rep[key].marketValue    = parseFloat(value.marketValue);
                        $scope.rep[key].cash           = parseFloat(value.cash);
                    });
                } ,
                 function(data) {
                    console.log("My error: " + data);
                }
            );
        })
        .then(function() {
          for (var i = 0; i < $scope.rep.length; i++) {
            $scope.totals.marketValue += $scope.rep[i].marketValue;
            $scope.totals.cash += $scope.rep[i].cash;
          }
        })(); // IIFE

答案 1 :(得分:1)

$http.get()返回一个promise,只有一旦该promise被解析,它才会运行.then()块中的所有代码。 (如果promise已解决,则第一个成功回调一个,如果拒绝承诺,则返回第二个错误回调。)

当您的代码到达for循环时,您已收到$http.get()的承诺对象,但您尚未在.then()块内运行代码,您在$scope.rep内设置值的位置。 for循环不会执行,因为$scope.rep.length为0,所以没有迭代。

要解决此问题,您可以将for循环放在.then()块中,如下所示:

(function loadData() {
    $http.get('result.json')
        .then(function (data) {
            angular.forEach(data['data'], function (value, key) {
                $scope.rep[key] = value;
                $scope.rep[key].marketValue = parseFloat(value.marketValue);
                $scope.rep[key].cash = parseFloat(value.cash);
            });

            for (var i = 0; i < $scope.rep.length; i++) {
                $scope.tot.marketValue += $scope.rep[i].marketValue;
                $scope.tot.cash += $scope.rep[i].cash;
            }
        }, function (data) {
            console.log("My error: " + data);
        });
})();

我相信应该这样做。