在 http 服务 returns 之后,范围变量未获取数据对象

Scope variable not getting data object after http service returns

我正在尝试读取服务器上的文件列表。 HTTP GET 方法服务 returns 文件列表,但控制器中的范围变量未使用 return 值更新。你能帮我找出问题所在吗?

app.controller('RdaController', ['$scope', ', 'RdaService', function($scope, RdaService) {
  $scope.listOfFilesOnCTP = "";
 
 $scope.GetListOfFilesonCTP = function(path){
  $scope.$apply(function(){
   $scope.listOfFilesOnCTP = RdaService.getListOfFilesonCTP(encodeURIComponent(path)); 
  });
  //path = path.replace(/\//g, '_');
  console.log($scope.listOfFilesOnCTP);  //--> This scope variable does not get updated.
  return $scope.listOfFilesOnCTP;
 }
}]);

app.service('RdaService', ['$http', function($http) { 
  this.getListOfFilesonCTP = function(path){   
   return $http ({
   method: "GET",
  url: "../api/CTP/getFilesonCTP/"+ path,
  headers: { 'Content-Type': 'application/json' }
  }).success(function(data){
  return data;    //---> contains the expected value
  }).error(function(data){
   return data;
  });
};
}]);
 <div class="col-md-3" id="CTP Jobs">
  <h3>JOBS</h3>
  <table class="table table-striped"
   ng-init="GetListOfFilesonCTP('/home/topas/rda_app/JOBS')"
   ng-model="listOfFilesOnCTP">   <!-- This variable is not updated-->
   <div ng-repeat="file in listOfFilesOnCTP">
    <span><tr>{{file}}
     </tr></span>
   </div>
  </table>
 </div>

您的代码中有几处错误。

  1. return 只承诺 return 通过 $http.get 方法从服务中编辑。因为当您尝试 return 来自 $http 方法的 .success.error 回调的数据时。它不会 return 返回数据。
  2. 在服务方法调用上使用 .then 函数,成功时将使用由 $http 编辑的数据 return 调用第一个函数。
  3. 您期望 console.log($scope.listOfFilesOnCTP); 打印由服务 return 编辑的数据。不过这不会return吧。异步调用不能以这种方式工作。他们将return以特殊方式输出数据,如承诺解析回调方式。
  4. 这里不需要使用$scope.$apply,因为$http服务已经处理了摘要周期。
  5. 尽量减少 ng-init 的使用,您可以在控制器初始化时调用该方法。

服务

app.service('RdaService', ['$http', function($http) { 
  var self = this;
  self.getListOfFilesonCTP = function(path) {     
      return $http ({
      method: "GET",
        url: "../api/CTP/getFilesonCTP/"+ path,
        headers: { 'Content-Type': 'application/json' }
    });
  };
}]);

然后在控制器中检索数据时使用该承诺。

app.controller('RdaController', ['$scope', 'RdaService', function($scope, RdaService) {
    $scope.listOfFilesOnCTP = "";

    $scope.GetListOfFilesonCTP = function(path) {
        $scope.listOfFilesOnCTP = RdaService.getListOfFilesonCTP(encodeURIComponent(path)).then(function() {
            console.log($scope.listOfFilesOnCTP);
        });
    };
}]);