2017-02-18 58 views
0

我可能會嘗試一些不應該的東西。 還沒有把我的頭圍繞整個「單身」的東西。離子工廠返回空物體

事情是,我有一個支持從API獲取一些json數據的工廠。 我收到了一個從工廠返回的空對象。

任何幫助,非常感謝。

.factory('specialities', function($http){ 
    var specialities = []; 
    return { 
     getspecialities: function(){ 
      $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       specialities = response.data.list; 
      }, function errorCallback(response) { 

      }); 
      return specialities; 
     } 
    }    
}) 

這是我的控制器。

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', 'areas', '$timeout', 
function ($scope, $stateParams, specialities, areas, $timeout) { 
    $scope.specialities = specialities.getspecialities(); 
    $scope.areas = areas.getareas(); 
    //console.log($scope.areas); 
    $scope.slide = function(){ 
     console.log($scope.specialities); 
     console.log($scope.areas); 
    } 
    $timeout($scope.slide, 5000); 
}]) 

我得到的只是在控制檯中的空數組,甚至在超時之後。 請幫忙。

謝謝

----編輯 我想下面的代碼。 控制器

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', '$timeout', '$state', 
function ($scope, $stateParams, specialities, $timeout, $state) { 
    specialities.getspecialities().then(function(specialities) 
    { 
     $scope.specialities = specialities; 
     console.log($scope.specialities); 
    }); 
}]) 

.factory('specialities', function($http, $q){ 
    return { 
     getspecialities: function(){ 
      return $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       return response.data.list; 
      }); 
     } 
    }    
}) 

現在控制檯從未記錄和工廠似乎不叫稱呼是因爲API網址不叫。

回答

0

您的$http調用是異步的,並返回一個Promise。

您的return specialities$http調用剛開始後執行,但在它實際完成其工作之前執行。

更改您的getspecialities函數以實際返回$http(這是Promise)的返回值,並在調用它時使用該承諾。

服務:

.factory('specialities', function($http, $q){ 
    return { 
     getspecialities: function(){ 
      return $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       return response.data.list; 
      }; 
     } 
    }    
}) 

控制器:

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', 'areas', '$timeout', 
function ($scope, $stateParams, specialities, areas, $timeout) { 
    specialities.getspecialities().then(function(specialities) 
    { 
     $scope.specialities = specialities; 
     ... any other stuff that needs to happen when you receive the value of specialities ... 
    }); 
    ... 

}]) 
+0

我試了一下代碼。但似乎工廠的功能沒有被調用。我已更新我的答案以反映您的建議。 –

+0

添加更多日誌以查看是否執行了哪些代碼路徑。很有可能你的'$ http'調用返回一個錯誤(在每個'then'中添加第二個函數並記錄在那裏檢查)。 – jcaron

+0

我很興奮,我其實並沒有改變域名。哈哈。現在正在工作。感謝您的幫助。 –

0

試試這個

控制器

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', '$timeout', '$state', 
function ($scope, $stateParams, specialities, $timeout, $state) { 
    specialities.getspecialities(function(specialities) 
    { 
     $scope.specialities = specialities; 
     console.log($scope.specialities); 
    }); 
}]); 

服務

.factory('specialities', function($http, $q){ 
    return { 
     getspecialities: function(callback){ 
      return $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       return callback(response.data.list); 
      }); 
     } 
    }    
})