1

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

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>

4

1 回答 1

1

您在代码中弄错了几件事。

  1. 只返回$http.get服务中方法返回的承诺。因为当您尝试从方法的.success&.error回调返回数据时$http。它不会返回数据。
  2. 在服务方法调用上使用.then函数,如果成功,它将使用 $http 返回的数据调用第一个函数。
  3. 您期望console.log($scope.listOfFilesOnCTP);打印服务返回的数据。但这不会返回它。异步调用不能以这种方式工作。他们将以特殊的方式返回数据,如承诺解析回调方式。
  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);
        });
    };
}]);
于 2016-04-11T19:46:55.003 回答