2015-02-24 5 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

+0

Я отредактировал мой вопрос, это не проблема. –

ответ

1

Похоже, вы объявили фабрику myappApi до того, как функция myappApi фактически определена. Попробуйте что-то вроде:

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

Такая же ошибка. я также не получил разницу между двумя методами реализации услуг –

+0

Yup. Похож на опечатку. Должен передать вашу служебную функцию методу module(). :) PS. У вас есть Plunkr, на который вы можете указать? – brianvaughn

+0

Это хороший момент. Если угловой модуль уже определен где-то, вам нужно отбросить [] в объявлении модуля. Или же вы повторно объявляете модуль. Во-вторых, то, как я это делал, просто гарантирует, что функция будет определяться к моменту объявления фабрики. Когда первая строка выполняется в вашем примере кода, функция 'myappApi' еще не определена. Он определяется на следующей строке. +1 на plunkr – Kenny

2

Посмотрите в CHANGELOG.md файла углового кэша: "- Угловой модуль переименованного углового кэша - DSCacheFactory переименован в CacheFactory"

Вам придется изменить:

  1. app.js: вместо выражения « Гюлер-data.DSCacheFactory»использование„углового кэш“
  2. service.js вместо„DSCacheFactory“использования„CacheFactory“
в контроллере
Смежные вопросы