2016-01-06 175 views
0

在下面的代碼的局部變量,訪問在angularjs控制器

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循環不執行?

+0

因爲AJAX代表「異步...」,並且你在'$ http'調用返回之前擊中循環。 – Antiga

+0

http.get調用是異步的,所以當循環執行時,rep.length仍然是0。 – Karmacon

回答

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

$http.get()返回一個承諾,只有一次是承諾得到解決它運行在.then()塊的所有代碼。 (如果承諾已解決,則返回第一個成功回調;如果承諾被拒絕,則返回第二個錯誤回叫。)

當代碼到達for循環時,您已收到來自$http.get()的承諾對象,但是您尚未運行.then()區塊內的代碼,您可以在$scope.rep內設置值。 for循環不執行,因爲$scope.rep.length爲0,所以不需要迭代。

爲了解決這個問題,你可以把你的循環您.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); 
     }); 
})(); 

我認爲應該這樣做。