如何在多个http调用的数据异步时对列表进行排序

时间:2015-07-09 23:12:21

标签: angularjs

我需要循环一个URL列表并在一个表中显示结果。 似乎orderBy不起作用,因为list($scope.versions)来自多个HTTP调用,而HTTP是异步的。

控制器:

var callApi = function (app, env, index, url) {
  $http.get(url).
     success(function(data) {
       data.pos=index;
       $scope.versions[app].push([data]);
     }).
     error(function(data, status) {
       var errorData = {};
       errorData.pos=index;
       $scope.versions[app].push([errorData]);
     });
   console.log($scope.versions);
 };

HTML:

<tbody>
  <tr ng-repeat="(k,v) in versions">
    <td>{{k}}</td>
    <td ng-repeat="item in v |  orderBy:'item[0].pos'" 
      ng-class="{'danger': item[0].error === true, 'success': item[0].error === false}">
      [{{item[0].pos}}]
    </td>
  </tr>
</tbody>

1 个答案:

答案 0 :(得分:0)

有点不清楚你究竟想要做什么,而且不清楚你的数据是什么样的,但从一般意义上讲,你可以随时对数据进行排序。

例如,您可以使用splice()将数据插入数组中所需的数据:

$scope.items = [];
var urls = [ <some urls> ];
urls.forEach( function (url) {
  $http.get(url)
    .success( function (data) {
      var position = getPosition(data);
      $scope.items.splice(position, 0, data);
    })
    .error( function (data, status) {
      // Handle the error case
    });
});

function getPosition (data) {
  // Some code to find where the element
  // should be inserted into the array
  return position;
}

或者,您可以在添加新数据后每次对数据进行排序:

$scope.items = [];
var urls = [ <some urls> ];
urls.forEach( function (url) {
  $http.get(url)
    .success( function (data) {
      $scope.items.push(data);
      $scope.items.sort(itemsCompareFunc)
    })
    .error( function (data, status) {
      // Handle the error case
    });
});

function itemsCompareFunc (a, b) {
  // Some logic to compare both items
}