2014-09-12 75 views
0

我有我的控制器功能的數據,要求DataService的,我試圖添加到當前範圍的變量,但它給我未定義的錯誤Angularjs不能將數據服務的迴應範圍變量

$scope.affiliates = d.data; 
      if (isNaN($scope.affiliate_id)){ 
       var i = 0; 

       while (i < $scope.affiliates.length){ 


        var affiliate_id = $scope.affiliates[i].affiliate_id.replace(/["']/g, ""); 
        DataService.getAffiliateConversionApiService(affiliate_id).then(function(apiData){ 

         $scope.affiliates[i].apiData = apiData;//ERROR IN HERE 
        }); 
        i++; 
       } 
      } 

類型錯誤: $ scope.affiliates [i]未定義

我也嘗試從dataService返回數據並將其設置在外部,但始終返回空值。 我該如何解決這個問題?

+0

你嘗試過一個foreach而不是while?這可能是聯營公司的關鍵所在。 – SoluableNonagon 2014-09-12 17:12:21

+0

做一個控制檯日誌到d.data,看看你得到了什麼,它看起來像你沒有得到一個數組對象,或者如果你真的讓它空着。 – 2014-09-12 17:13:39

回答

0

這不是一個真正的答案,但這裏有一些調試應該幫助你。 另外,我使用while循環切換至採用了棱角分明的的forEach

$scope.affiliates = d.data; 
     if (isNaN($scope.affiliate_id)){ 
      console.log($scope.affiliates); // what does this return? 

      angular.forEach($scope.affiliates, function(value, index){ 
       console.log(value); // output the affiliate, if any 

       var affiliate_id = value.affiliate_id.replace(/["']/g, ""); 
       DataService.getAffiliateConversionApiService(affiliate_id).then(function(apiData){ 
        console.log(apiData); // see what is returned 
        $scope.affiliates[index].apiData = apiData; // still an error? 
       }); 
      }); 
     } 
+0

非常感謝,它工作。但只有我不理解的是爲什麼會foreach工作,而不是while循環,因爲他們在做幾乎相同的事情 – 2014-09-12 17:26:27

+0

@AsifAlamgir請檢查我的答案,並讓我知道它是否有助於理解'while'和'forEach'的區別 – bmleite 2014-09-12 17:27:52

2

不要忘記,getAffiliateConversionApiService返回一個承諾(這意味着它是一個異步操作),因此您的while塊將執行每一個可能的i之前你甚至從getAffiliateConversionApiService得到結果。

讓我們想象一下$scope.affiliates.length是。當您執行then內的回撥代碼時,您的i將爲。

一個解決方案是使用angular.forEach而不是while。但是,如果你仍然想使用while你需要將i值存儲在另一個變量:

while (i < $scope.affiliates.length){ 
    var index = i; 
    var affiliate_id = $scope.affiliates[i].affiliate_id.replace(/["']/g, ""); 
    DataService.getAffiliateConversionApiService(affiliate_id).then(function(apiData){ 
    $scope.affiliates[index].apiData = apiData; 
    }); 
    i++; 
} 
+0

@bmleite現在更有意義了。謝謝 – 2014-09-12 17:30:06