2016-04-11 1 views
1

zurückgibt Ich versuche, Liste der Dateien auf einem Server zu lesen. Der HTTP-GET-Methodendienst gibt die Liste der Dateien zurück, aber die Bereichsvariable im Controller wird nicht mit dem Rückgabewert aktualisiert. Kannst du mir bitte helfen herauszufinden, was schief läuft?Bereichsvariable, die kein Datenobjekt erhält, nachdem HTTP-Dienst

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

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

Antwort

1

Sie hatten falsch mehrere Dinge in Ihrem Code.

  1. Geben Sie nur das Versprechen zurück, das von $http.get Methode aus Service zurückgegeben wird. Weil Sie versuchen, Daten von .success & .error Rückruf von $http Methode zurückzugeben. Es gibt keine Daten zurück.
  2. Verwenden Sie .then Funktion über Service-Methode Aufruf, bei Erfolg, die erste Funktion mit Daten von $ http zurückgegeben wird.
  3. Sie haben erwartet, console.log($scope.listOfFilesOnCTP); zu erhalten, um Daten zu drucken, die vom Dienst zurückgegeben werden. Aber das wird es nicht zurückgeben. Async-Aufrufe funktionieren nicht auf diese Weise. Sie werden Daten in einer speziellen Art und Weise wie Versprechen Auflösung OR Rückrufart zurückgeben.
  4. Keine Notwendigkeit, $scope.$apply hier zu verwenden, als Digest-Zyklus wurde bereits von $http Service betreut.
  5. Versuchen Sie, die Verwendung von ng-init zu minimieren, können Sie diese Methode auf Controller-Initialisierung selbst aufrufen.

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

tun dann dieses Versprechen verwenden, während die Daten innerhalb Controller abrufen.

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

Hallo @ Pankaj, Danke für eine ausführliche Antwort. Ich benutzte ng-init zum Aufruf der Controller-Funktion, da ich keine andere Möglichkeit kannte, diese Funktion aufzurufen. Können Sie mir sagen, wie man die Controller-Funktion in diesem Szenario von der HTML-Seite aus aufruft? –

+0

@SharatChandra froh, Ihnen zu helfen .. Danke :) –

+0

@SharatChandra kann ich wissen, warum Sie Funktion aus HTML aufrufen möchten? –