2014-11-21 84 views
1

我是angularjs的新手。我試圖調用一個函數在一個工廠,但我收到以下錯誤,Angularjs調用工廠方法時出錯

Error: [$injector:undef] Provider 'todoStorage' must return a value from $get factory method. 

這是我的工廠,

todomvc.factory('todoStorage', function ($q,$http) { 
var STORAGE_ID = 'todos-angularjs-perf'; 

function get(){ 
      var promise = $q.defer(); 

      $http.get('http://localhost/test.php').success(function(data){ 
        promise.resolve(data); 
      }); 

      return promise.promise; 
     } 

}); 

這是我如何調用該函數,

var todos = $scope.todos = todoStorage.get(); 

究竟發生了什麼以及爲什麼會出現這個錯誤?

回答

4
todomvc.factory('todoStorage', function ($q,$http) { 
var STORAGE_ID = 'todos-angularjs-perf'; 


function get(){ 

    return $http.get('http://localhost/test.php'); 
} 

return{get:get}; 

}); 

//call the service like this 
todoStorage.get().then(function(res){ 
    $scope.todos = res.data; 
}); 

您的代碼沒有返回實際的服務工廠。由於您正在使用工廠,因此您已返回一些指向您內部函數的JavaScript對象。否則,它不是一個有效的工廠,你的外部代碼將無法進入內部獲取功能。

+0

錯誤已解決,但爲什麼我沒有收到數據。承諾返回null。推遲使呼叫同步嗎? – 2014-11-21 03:57:26

+0

我建議您解決呼叫方的承諾,而不是在服務中。此外,基於$ q的實現,承諾永遠不會同步,即使承諾立即解決。 – TGH 2014-11-21 04:01:19

+0

我不會在這裏創造一個新的承諾。返回由$ http生成的原始承諾會更容易。 – TGH 2014-11-21 04:01:56