2015-02-24 123 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'
在您的控制器