2015-06-15 4 views
0

Я пытаюсь получить массив Rest, а затем отображать его на своем HTML. проблема, с которой я столкнулся, заключается в том, что на моей фабрике я могу получить массив и отобразить его содержимое, но не в моем контроллере, где я всегда получаю Undefined var. вот моя фабрикаПочему я получаю var undefined

.factory('coursesService', function($resource) { 
       var service = {}; 
       service.getAllCouses = function(){ 
        var Courses = $resource("/myproject/rest/training/trainings"); 
        var data = Courses.query().$promise.then(function(data) 
          { 
         service.data= data; 
         console.log("ligne 1: ", service.data[0].name); 
         console.log("ligne 1: ", service.data[0].creator); 
         console.log("ligne 2: ", data[1].name); 
         console.log("ligne 2: ", data[1].creator); 
         return service.data; 
          }); 
       } 
       return service; 
      }) 

и мой контроллер

.controller("CoursesController", 
      function CoursesController($scope, coursesService) { 
       var courses = {}; 
       courses = coursesService.getAllCouses(); 
       console.log("courses: ", courses); 
      }) 

как результат я получаю это:

courses: undefined 
ligne 1: Angular 
ligne 1: Object {id: "1", username: "User1", email: "[email protected]", password: "password", userProfile: Object} 
ligne 2: JavaScript 
ligne 2: Object {id: "1", username: "User1", email: "[email protected]", password: "password", userProfile: Object} 

Почему я получаю курсы: не определено? и не должен отображаться после списка, который я показываю на заводе?

+1

потому service.getAllCouses() не возвращает ничего? – redbirdo

+0

И потому, что он асинхронный, поэтому данные не доступны во время возврата. Вероятно, вы должны прочитать [этот возможный дублирующий вопрос] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) о возврате данных из асинхронной операции. В этом коде есть что-то не так: большинство из них связано с асинхронным характером операции. – jfriend00

+0

@ jfriend00 да, ссылка iv очень полезна, теперь я получаю возврат от функции. Я обновил завод на основе этого [link] (http://andyshora.com/promises-angularjs-explained-as-cartoon.html). но теперь у меня возникла проблема с обработкой данных, полученных в контроллере, который имеет этот формат 'd {$$ state: Object}' –

ответ

0

getAllCouses() не возвращает значение, он просто устанавливает две локальные переменные, курсы и данные.

Пояснение Courses.query разрешается только после завершения веб-запроса, поэтому эти журналы задерживаются.

2

Функция getAllCouses никогда ничего не возвращает, и поэтому ее всегда вызывают undefined. Обратный вызов запросу запрос then обработчик возвращает что-то, но не getAllCouses.

Вам нужно будет вернуть getAllCouses обещание, а затем использовать результат из обработчика then по этому обещанию. Вы не можете просто использовать его возвращаемое значение напрямую, а не если Courses.query() является асинхронным (а если нет, то почему он возвращает обещание?).

Это будет выглядеть примерно так:

.factory('coursesService', function($resource) { 
    var service = {}; 
    service.getAllCouses = function(){ 
     var Courses = $resource("/myproject/rest/training/trainings"); 
     var data = Courses.query().$promise.then(function(data) { 
      service.data= data; 
      console.log("ligne 1: ", service.data[0].name); 
      console.log("ligne 1: ", service.data[0].creator); 
      console.log("ligne 2: ", data[1].name); 
      console.log("ligne 2: ", data[1].creator); 
      return service.data; 
     }); 
     return data;  // <=== Return the promise (`data` is a bit of a suspect name) 
    }; 
    return service; 
}) 

Тогда:

.controller("CoursesController", function CoursesController($scope, coursesService) { 
    coursesService.getAllCouses().then(function(courses) { // <=== Use the promise 
     console.log("courses: ", courses);     // <=== 
    });              // <=== 
}) 

... но я не Угловая парень.

0

Я исправил проблему путем обновления моей службы и контроллер, как это:

.factory('coursesService', function($resource) { 
     return $resource("/myproject/rest/training/trainings", { 
      query : { 
       method : "GET", 
       isArray : true 
      } 
     }); 
    }); 

Я просто добавил

isArray : true 

и я обновил контроллер

.controller(
      "CoursesController", 
      function UserController($scope, coursesService) { 
       coursesService.query(function(data) { 
        console.info("data: ", data) 
        console.log("1st course: ", data[0].name) 
        $scope.Courses = data; 
       }); 
0

Я это исправить просто таким образом:

.factory('coursesService', function($resource) { 
     return $resource("/myproject/rest/training/trainings") 
    }) 

и контроллер:

.controller("coursesController", function($scope, coursesService) { 
     coursesService.query(function(data) { 
      $scope.Courses = data; 
     }); 
    }) 
Смежные вопросы