Как я могу вызвать функцию в контроллере из службы

Я хотел бы спросить, возможен ли вызов функции getItems (); в контроллере ItemController (загружает список данных) из сервиса fileUpload (после загрузки изображения) - пример ниже.

После загрузки я хочу обновить список элементов, но я не знаю, как мне написать обратный вызов...

Спасибо за помощь.

    app.controller('ItemController', ['$scope', '$http', 'fileUpload', function($scope, $http, fileUpload){
    getItems();
  function getItems(){  
  $http.post("../db/getItems.php").success(function(data){
        $scope.items = data;
       });
  };

...
...
...
...


app.service('fileUpload', ['$http', function ($http) {

        this.uploadFileToUrl = function(file, object, extId){
           var fd = new FormData();
           fd.append('file', file);
              $http.post("../db/upload.php?object="+object+"&extId="+extId, fd, {
                  transformRequest: angular.identity,
                  headers: {'Content-Type': undefined}
               })

               .success(function(data){
                  alert(JSON.stringify(data));
                  ItemController.getItems(); // <= Here....after upload I would like to call function getItems()
                  
               })
    
               .error(function(){
               });
        }
     }]);

1 ответ

Решение

Что вы должны сделать, так это вернуть обещание $http из метода службы и затем, если это обещание выполнено успешно, вызвать метод контроллера. Выполнение функции контроллера в сервисе не является хорошей практикой, хотя вы можете достичь этого, передав функцию в качестве обратного вызова.

this.uploadFileToUrl = function(file, object, extId){
   var fd = new FormData();
   fd.append('file', file);
   return $http.post("../db/upload.php?object="+object+"&extId="+extId, fd, {
       transformRequest: angular.identity,
       headers: {'Content-Type': undefined}
   });
};

И затем внутри контроллера вы можете вызвать метод службы и затем выполнить функцию контроллера после разрешения этого обещания.

fileUpload.uploadFileToUrl().then(function(data){
   getItems(); //controller function.
})
Другие вопросы по тегам