$ q.all中的异步调用?

时间:2014-03-17 15:54:01

标签: asynchronous ng-grid

我有以下案例。 一个ngGrid标签是从异步服务中读取的,因此标签是动态读取的,并且tey不是硬编码的。

我收集了所有异步调用,将标签数据提取到$ q.all中,然后在.then部分中提取数据。

但在某些情况下,标签不会显示在ngGrid中,所以这必须与异步调用和ngGrid同步有关。

我应该如何编码$ q.all及其异步调用,以便我确信当它们被设置为ngGrid时,它们包含正确的标签?

Br Dan

    var deferred = $q.defer();
    myService.getAttribute(key, function(label) {
      var result = label;
      deferred.resolve(result);
    });
    return deferred.promise;
  };

  /** Fetching labels asynchronously */
  $q.all(
      [   getLabelTxt('Form.Field1'),
          getLabelTxt('Form.Field2'),
          getLabelTxt('Form.Field3') ]).then(
      function(data) {
        $scope.setColDefs(data);
      });

  $scope.gridOptions = {
    data : 'dataModel',
    enableColumnResize : true,
    selectedItems : [],
    columnDefs : [
                  {
                    field : 'Field1',
                    displayName : ''
                  }, {
                    field : 'Field2',
                    displayName : ''
                  }, {
                    field : 'Field3',
                    displayName : ''                          
                  } ]
  };

  /** Setting values fetched from Asynch service */
  $scope.setColDefs = function(rows) {
    for (var i = 0; i < rows.length; i++) {
      if ($scope.gridOptions.columnDefs[i] !== undefined) {
        $scope.gridOptions.columnDefs[i].displayName = rows[i];
      }
    }
  };

1 个答案:

答案 0 :(得分:0)

ng-grid 2.x在columnDefs上放置一个$watch,如果它是一个字符串。否则它不会做任何更新。您可以像这样定义columnDefs:

$scope.columns = [
  { field : 'Field1' },
  { field : 'Field2' },
  { field : 'Field3' }
];

$scope.gridOptions.columnDefs = 'columns';

然后直接更新$scope.columns

$scope.setColDefs = function(rows) {
  for (var i = 0; i < rows.length; i++) {
    if ($scope.columns[i] !== undefined) {
      $scope.columns[i].displayName = rows[i];
    }
  }
};

以下是一个例子:http://plnkr.co/edit/fc6QVp?p=preview