2015-06-15 20 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非常有幫助,我現在正在從函數返回。我根據這個[鏈接]更新了工廠(http://andyshora.com/promises-angularjs-explained-as-cartoon.html)。但是我現在面臨的一個問題是如何處理控制器中接收到的數據,格式爲'd {$$ state:Object}' –

回答

0

getAllCouses()不返回值,它只設置兩個局部變量,即課程和數據。

Courses.query承諾僅在Web請求完成後才能解決,因此這些日誌會被延遲。

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);     // <=== 
    });              // <=== 
}) 

...但我不是一個角的傢伙。

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

我解決這個問題:

相關問題