2015-02-24 67 views
0

我有一個簡單的服務,它從HTTP端點抓取數據將其發送回控制器。AngularJS未能注入服務

我的服務還implemnted緩存不過,我就在這行代碼此錯誤TypeError: undefined is not a function在我的控制器

myappApi.getItems().then(function(data) 

我試圖弄清楚爲什麼我不能。 這裏是控制器代碼:

.controller('ItemsCtrl',['$scope','myappApi',function($scope, myappApi){ 
    myappApi.getItems().then(function(data){ 
     $scope.items = data; 
    }); 
}]) 

正如我在這裏使用Ioniframework我如何在app.js注入我的服務:

angular.module('myApp', ['ionic', 'myApp.controllers', 'myApp.services', 'angular-data.DSCacheFactory']) 

,這裏是我的服務的代碼:

(function() { 
    'use strict'; 

    angular.module('myApp.services',[]).factory('myappApi', ['$http', '$q', '$ionicLoading', 'DSCacheFactory', myappApi]); 

    function myappApi($http, $q, $ionicLoading, DSCacheFactory) { 


     self.itemsCache = DSCacheFactory.get("itemsCache"); 

     //to re-use expired cached data if no internet connection 
     self.itemsCache.setOptions({ 
      onExpire: function (key, value) { 
       getItems() 
        .then(function() { 
         console.log("items items Cache was automatically refreshed.", new Date()); 
        }, function() { 
         console.log("Error getting data. Putting expired item back in the cache.", new Date()); 
         self.itemsCache.put(key, value); 
        }); 
      } 
     }); 

     function getItems() { 
      var deferred = $q.defer(), 
       cacheKey = "items", 
       itemsData = self.itemsCache.get(cacheKey); 

      if (itemsData) { 
       console.log("Found data inside cache", itemsData); 
       deferred.resolve(itemsData); 
      } else { 
       $http.get("services/data.json") 
        .success(function(data) { 
         console.log("Received data via HTTP"); 
         self.itemsCache.put(cacheKey, data); 
         deferred.resolve(data); 
        }) 
        .error(function() { 
         console.log("Error while making HTTP call."); 
         deferred.reject(); 
        }); 
      } 
      return deferred.promise; 
     } 

     return { 
      getItems: getItems 
     }; 
    }; 
})(); 

謝謝你的時間。

+0

你'vascularApi',未在任何地方定義的我可以看到 – Ronnie 2015-02-24 21:47:09

+0

我編輯我的問題這不是真的問題。 – 2015-02-24 21:49:47

回答

1

看起來您已經在myappApi函數實際定義之前聲明瞭myappApi工廠。嘗試是這樣的:

angular.module('myApp.services',[]).factory('myappApi', ['$http', '$q', '$ionicLoading', 'DSCacheFactory', 
function($http, $q, $ionicLoading, DSCacheFactory) { 
    // myappApi code 
}]); 
+0

同樣的錯誤。我也沒有得到執行服務 – 2015-02-24 21:58:20

+0

的兩種方法之間的區別。看起來像一個錯字。將你的服務函數傳遞給module()方法。 :) PS。有一個你可以指向的Plunkr? – brianvaughn 2015-02-24 21:59:16

+0

這是一個很好的觀點。如果角度模塊已經在某個地方定義好了,則需要在模塊聲明中刪除[]。否則,你重新聲明模塊。其次,我做這件事的方式只是確保在宣佈工廠時定義該功能。在代碼示例中執行第一行時,myappApi函數尚未定義。它在下一行被定義。 +1上的plunkr – Kenny 2015-02-24 22:27:38

2

您可以在角緩存文件CHANGELOG.md一看: 「 - 更名爲角緩存 角模塊 -更名爲CacheFactory DSCacheFactory

您將必須更改:

  1. app.js: 而不是'an gular-data.DSCacheFactory」使用 '角緩存'
  2. service.js 而不是 'DSCacheFactory' 使用 'CacheFactory'
在您的控制器