我试图读取服务器上的文件列表。 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;
答案 0 :(得分:1)
你在代码中误解了几件事。
$http.get
方法从服务返回的承诺。因为当您尝试从.success
&amp; .error
方法的$http
回调。它不会返回数据。.then
函数,成功时将使用$ http返回的数据调用第一个函数。console.log($scope.listOfFilesOnCTP);
来打印服务返回的数据。但这不会归还它。异步调用不能以这种方式工作。他们将以特殊方式返回数据,例如承诺解析 OR 回调方式。$scope.$apply
,因为$http
服务已经完成了摘要周期。ng-init
的使用,你可以在控制器初始化本身上调用该方法。<强> 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);
});
};
}]);