在http服务返回

时间:2016-04-11 19:44:09

标签: angularjs angularjs-scope angularjs-apply

我试图读取服务器上的文件列表。 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>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

你在代码中误解了几件事。

  1. 仅返回$http.get方法从服务返回的承诺。因为当您尝试从.success&amp; .error方法的$http回调。它不会返回数据。
  2. 在服务方法调用上使用.then函数,成功时将使用$ http返回的数据调用第一个函数。
  3. 您希望获得console.log($scope.listOfFilesOnCTP);来打印服务返回的数据。但这不会归还它。异步调用不能以这种方式工作。他们将以特殊方式返回数据,例如承诺解析 OR 回调方式。
  4. 此处无需使用$scope.$apply,因为$http服务已经完成了摘要周期。
  5. 尽量减少ng-init的使用,你可以在控制器初始化本身上调用该方法。
  6. <强> SEVICE

    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);
            });
        };
    }]);