2017-04-14 70 views
0

我想創建一個包含一些對象

首先數組angular.forEach循環,我從包含的設備列表這樣

[ 
{accountID : "sysadmin",deviceID : "123"}, 
{accountID : "sysadmin",deviceID : "3"} 
    ... 
    ] 

然後服務器的第一陣列我創建包含一些對象,每個對象表示的裝置(設備ID)的第二陣列和包含該裝置,我從服務器獲取的事件的數組

我第一陣列這樣在做一個循環:

$scope.myArrayofDevices = []; 

angular.forEach(response, function(device){ 

    $scope.myObject={}; 

    $scope.myObject.device = device.deviceID; 

    $http.get('events') 
     .success(function (data) { 

     $scope.myObject.events = data;   

     }); 


     $scope.myArrayofDevices.push($scope.myObject); 

    });//end for loop 

我正確地從服務器獲取事件數據。

但是,當我檢查$scope.myArrayofDevices陣列我得到的只有設備ID的第一個對象,並沒有事件陣列,並與設備ID和事件數組的第二個對象正確

這樣的:

[ 
{deviceID : 123, events:}, 
{deviceID : 3 , events : array[5]} 
] 

如何我可以解決這個問題嗎?

請注意,我試圖將數組分配給$scope.myObject.events它完美的問題是使用具有$ HTTP循環

+2

嘗試定義在foreach回調函數內一個新的變量'myObject'。使用'var myObject = {}'而不是'$ scope.myObject = {}' – Titus

+0

謝謝@Titus你的想法解決了我的問題 – Taha

回答

2

您可以使用$q.all()解決承諾的數組,並得到最終結果

angular.module('app', []); 

angular.module('app').controller('ExampleController', ['$scope', '$q', function($scope, $q) { 

    $scope.myArrayofDevices = []; 

    $scope.getDeviceObject = function(deviceId) { 
     return $http.get('events/' + deviceId).then(function(deviceEvents) { 
      return { 
       "device": deviceId, 
       "events": deviceEvents 
      }; 
     }); 
    } 

    var promises = []; 

    angular.forEach(response, function(device) { 
     promises.push($scope.getDeviceObject(device.deviceID)); 
    }); 

    /* 
    * Combines multiple promises into a single promise 
    * that will be resolved when all of the input promises are resolved 
    */ 
    $q.all(promises).then(function(devices) { 
     $scope.myArrayofDevices = $scope.myArrayofDevices.concat(devices); 
    }); 


}]);  
+0

推遲了反模式。 – dfsq

+0

回答編輯以更好地匹配問題。@ dfsq您可能是對的,但目前我沒有更好的答案,我認爲並不是那麼糟糕。我很想讀一個更好的! ^^ –

+1

只需刪除$延期,這是不需要的。 '$ scope.getDeviceEvents = function(deviceId){return $ http.get('events /'+ deviceId).then(function(response){return response.data;})}' – dfsq

0

事情是重新分配$scope.myObject到一個新的對象回調被觸發,分配事件,以舊的前。所以這兩個回調的屬性分配給同一個對象。 你可以把所有的代碼放在回調中。

0
1. Create a service: 

    function DataService($http, appEndpoint){ 
     return { 
      getLists: getData 
     } 

     function getData(){ 
      return $http.get(appEndpoint + 'lists') 
     } 
     } 

2. Create controller: 

function ListsController(DataService){ 
    var self = this; 
    self.data = null; 
    DataService.then(function(response){ 
     self.data = response.data; 
    }); 

    // Here manipulate response -> self.data; 
} 
1

首先:像Carnaru瓦倫丁說,你應該創建一個服務來包裝你$http電話。

其次,我沒有得到你的$http.get('events')電話。您不會傳遞任何參數(deviceID或者其他)。

它是否會爲每個設備返回所有事件的列表?對於特定設備?

如果你只是忘了一個參數添加到查詢:這裏是可以工作的解決方案:

var promises = response.map(function (device) { 
    return $http.get('events/' + device.deviceID) 
    .then(function (data) { 
     return { 
     device: device.deviceID, 
     events: data 
     }; 
    }); 
}) 

$q.all(promises) 
    .then(function (devices) { 
    $scope.myArrayofDevices = $scope.myArrayofDevices.concat(devices); 
    // alternatively: $scope.myArrayofDevices = devices; 
    }); 
+0

感謝您的幫助我完全從服務器獲取數據我把'事件'簡化代碼,但我的問題在最後一個數組中,數組中的對象中的某些屬性爲空 – Taha

+0

您應該嘗試使用我的或stej4n的解決方案! '$ q.all'將等待所有的承諾解決,然後返回數組中的所有響應。 – Julien