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サービスからのメソッドによって返された promise のみを返します。.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 に答える