Angular Js Factory не возвращает значения в контроллер

0

Моя фабрика возвращает undefined, когда я getPopularMovies метод getPopularMovies на фабрике с использованием контроллера, не знаю, какую ошибку я здесь сделал, пожалуйста, дайте мне знать

мой завод

    angular.module('ngMovies').factory('moviesFactory', function ($http) {
    var movies = [];

    function getPopularMovies() {
        var popularmoviesurl = "https://api.themoviedb.org/3/movie/popular?api_key=adf3d78d5c0f38313a68de730f02063a";
        return $http({method: 'GET', url: popularmoviesurl}).success(function (data, status, headers, config) {
            if (status == 200) {
                movies = data.results;
            } else {
                console.error('Error happened while getting the movie list.')
            }
        }).error(function (data, status, headers, config) {
            console.error('Error happened while getting the movie list.')
        });
        return movies;
    }

    return {

        getPopularMovies: getPopularMovies
    }

});

контроллер

 angular.module('ngMovies').controller('popularmoviesController', ['moviesFactory', '$scope', function (moviesFactory, $scope) {
    $scope.popularmovies = moviesFactory.getPopularMovies();
}]);
Теги:

3 ответа

0
Лучший ответ

Я предлагаю использовать обещания для асинхронных процессов.

function getPopularMovies()
{   
   var deferred = $q.defer();
   var popularmoviesurl = "https://api.themoviedb.org/3/movie/popular?api_key=adf3d78d5c0f38313a68de730f02063a";
   $http({method:'GET',url:popularmoviesurl}).
      success(function (data, status, headers, config) {
        if (status == 200) {
            deferred.resolve(data.results);
        } else {
           console.error('Error happened while getting the movie list.')
           deferred.reject();
      }
    }).error(function (data, status, headers, config) {
       deferred.reject();
       console.error('Error happened while getting the movie list.')
    });

    return deferred.promise;
}

а затем внутри вашего контроллера просто используйте

moviesFactory.getPopularMovies().then(function(data){
   $scope.popularmovies = data;
},function(){
  // your error handling
})
0

оказание услуг:

angular
  .module('ngMovies')
  .factory('moviesFactory', function($http) {
    function getPopularMovies(callback) {
      var popularmoviesurl = "https://api.themoviedb.org/3/movie/popular?api_key=adf3d78d5c0f38313a68de730f02063a";
      return $http({
        method: 'GET',
        url: popularmoviesurl
      }).
      success(function(data, status, headers, config) {
        if (status == 200) {
          callback(data.results);
        } else {
          console.error('Error happened while getting the movie list.')
        }
      }).
    }

    return {
      getPopularMovies: getPopularMovies
    }
  });

контроллер:

angular
  .module('ngMovies')
  .controller('popularmoviesController', ['moviesFactory', '$scope', function(moviesFactory, $scope) {
    moviesFactory.getPopularMovies(function(movies){
        $scope.popularmovies = movies;
    });
  }]);
0

Измените свой код контроллера следующим образом:

angular.module('ngMovies').controller('popularmoviesController', ['moviesFactory', '$scope', function (moviesFactory, $scope) {
    moviesFactory.getPopularMovies().then(function(data) {
         $scope.popularmovies = data.results;
    });
}]);

И в методе getPopularMovies return movies; утверждение не требуется, так как вы уже вернулись выше в том же методе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню