2016-01-06 2 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-loop не выполняется?

+0

Поскольку AJAX означает «асинхронный ...», и вы ударяете свой цикл до того, как возвращается вызов '$ http'. – Antiga

+0

HTTP.get вызов асинхронный, поэтому, когда цикл выполняется, rep.length по-прежнему 0. – Karmacon

ответ

1

Возможно, это может быть проблема с синхронизацией. Возможно, for-loop выполняется до того, как $ http.get() возвращает результат. Вы пытались выполнить цикл for после $ scope.rep инициализирован так?

(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); 
     }); 
})(); 

Я считаю, что должен это сделать.

Смежные вопросы