2013-10-18 41 views
-1

我需要添加元素,這是我得到的JSON格式轉換成數組作爲$ scope.array 我的代碼是:

$scope.sections=function(){ 
    $scope.array=[]; 

    $http.get("/app/query/?mod=find&type=all").success(function(data){ 

     $.each(data, function(i, row){ 
      $scope.array.push('aaa'); 
      console.log(row); 
     }); 


    }); 
    return $scope.array; 
} 
console.log($scope.sections()); 

但這個函數返回空數組,我如何添加元素到$scope.array

此字符串將數據添加到正確康壽console.log(row);,但$scope.array.push是不行的

+0

這是由於調用的異步性質。 – Chandermani

+0

可能重複[如何從AJAX調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – Stewie

回答

2

我真的修改到更多的東西像這樣

$scope.sections=function(){ 
    return $http.get("/app/query/?mod=find&type=all").then(function(resp){ 
     var array = []; 
     angular.forEach(resp.data, function(row, i){ 
      array.push(row); 
      console.log(row); 
     }); 
     return array; 
    }); 
}; 
$scope.array = $scope.sections(); 
$scope.array.then(function(data) { console.log(data); }); 

在這種情況下,我們簡單地返回從功能全的承諾。現在$ scope.array是一個承諾,而不是一個原始值。

在返回承諾之前,我們做了一個額外的函數來處理返回值。我們希望將其轉換爲數組,以便將來的任何用戶都能看到數組而不是對象。你可以做任何你需要的轉換,我只是簡單地從你的問題中獲取邏輯。

請記住,現在您的代碼必須知道如何處理承諾,而不是數組,但這種方式可以確保始終解決該值。如果您確實需要使用插值或其他方式將其綁定到UI,那麼角將自動解決該承諾。例如,

<div>{{array}}</div> 

在您的標記中會自動解析爲在準備就緒時創建的數組。沒有額外的代碼需要。

3

由於$http是異步它會返回一個空數組,因爲它需要時間來從服務器獲取數據,這就是爲什麼console.log(row)返回數據正確。

此外,您還需要致電$scope.$apply()以將新數據應用於範圍。

$scope.sections=function(callback){ 
    $scope.array=[]; 

    $http.get("/app/query/?mod=find&type=all").success(function(data){ 
     var temp = []; 
     $.each(data, function(i, row){ 
      temp.push('aaa'); 
      console.log(row); 
     }); 

     $scope.$apply(function() { 
      $scope.array = temp; 
     });   

     callback($scope.array); 
    }); 
} 

$scope.sections(function(result) { console.log(result); }); 
+0

您應該不必使用scope。$在$ http服務的回調中應用。當你可以返回承諾本身時,創建自己的回調參數也沒有意義。 AngularJS在內部很好地處理承諾,並在準備就緒時自動解決它們。您在promise對象中已經存在的功能之上添加了不必要的層。我的意思見下面的答案。 – Adam

+1

@Adam好點,謝謝你的更新。 –