2016-05-03 13 views
0

Ich benutze die $ cacheFactory, um einige Daten in meinem Cache zu speichern und alles funktionierte sehr gut bis heute, dass ich beschlossen habe, meine cacheFactory in eine einzige Klasse namens MyFactory.js zu trennen. Jetzt bin immer ich den Fehler:AngularJS - Fehle ich etwas in dieser Fabrikspritze?

TypeError: tableCacheFactory is not a function 

Weil es die Injektion als ein einfaches Verfahren oder etwas nehmen, weiß jemand, ob ich etwas fehlt hier bin?

main.js

angular.module('main-component', 
    ['my-component', 
    'my-cache-factory' 
    ]); 

MyFactory.js

angular.module('my-cache-factory', []) 

    .factory('tableCacheFactory', [ 
     '$cacheFactory', function ($cacheFactory) { 
      return $cacheFactory('my-cache'); 
     } 
    ]); 

MyService.js

angular.module('my-component', []) 

    .factory('my-component-service', 
     ['$rootScope', 
     '$http', 
     '$q', 
     'tableCacheFactory', 
     function ($rootScope, $http, $q, tableCacheFactory) { 

      function getMyData (prodNro) { 

       var deferred = $q.defer(); 
       var promise = deferred.promise; 

       var dataCache = tableCacheFactory.get('tablecache'); 

       if (!dataCache) { 
        dataCache = tableCacheFactory('tablecache'); // TypeError: tableCacheFactory is not a function 
       } 

       var summaryFromCache = dataCache.get('tablecache' + prodNro); 

       if (summaryFromCache) { 
        deferred.resolve(summaryFromCache); 

       } else { 

        $http({ 
         method: ... 
         data : ... 
         url: ... 
        }).success(function (data, status, headers, config) { 

         var objectResult = { 
          "data": data, 
          "status": status, 
          "headers": headers, 
          "config": config 
         } 

         if (data.response) { 
          // Save to cache 
          dataCache.put('tablecache'+prodNro, objectResult); 
         } 

         deferred.resolve(objectResult); 

        }).error(function (data, status, headers, config) { 

         ... 
        }); 

       } 

       return promise; 

      } 

Antwort

0

Sie scheinen einige Missverständnisse darüber, wie die $cacheFactory funktioniert.

In var dataCache = tableCacheFactory.get('tablecache'); verwenden Sie es wie ein initialisiertes Cache-Objekt, das ein anderes Cache-Objekt enthält.

Auf der anderen Seite dataCache = tableCacheFactory('tablecache'); nutzt es, wie es die $cacheFactory selbst war.

Und beide versuchen, auf 'tablecache' in etwas zuzugreifen, das ich denke, sollte schon der tableCache selbst sein.

Der Fehler ist genau das, was es sagt. As per the docs, Aufruf $cacheFactory('my-cache'); gibt keine Funktion zum Erstellen weiterer Caches zurück. Es gibt ein $cacheFactory.Cache Objekt mit Methoden wie put(key, value) und get(key) zurück. Benutze diese stattdessen.

würde ich die ganze Struktur des Caching ändern (beachten Sie, dass der Name der Fabrik geändert wird):

.factory('tableCache', [ 
    '$cacheFactory', function ($cacheFactory) { 
     //Return what the name of the factory implies 
     return $cacheFactory('tablecache'); 
    } 
]); 

Und verwenden Sie dann, dass mehr seltsam ‚tablecache‘, ohne Namensräume

zu tun
function getMyData (prodNro) { 
    ... 
    var summaryFromCache = tableCache.get(prodNro); 
    ... 
    tableCache.put(prodNro, objectResult); 
} 
0

Die tableCacheFactory wurde in das Modul my-cache-factory gewickelt. Sie müssen also zuerst das Modul in Ihr my-component Modul injizieren, bevor Sie es verwenden. So sollte es so aussehen:

angular.module('my-component', ['my-cache-factory']) 
+0

Bitte beachten Sie meine Bearbeitungsfrage und den Kommentar für die Antwort oben. – RicardoGonzales

0

Sie Ihre Cache-Fabrik in dem Modul definiert my-Cache-Fabrik, aber dann injiziert nie das Modul zu Ihrer Hauptkomponente-Service-Modul. Tun Sie stattdessen angular.module('my-component', ['my-cache-factory']).

+0

Ich glaube nicht, bitte sehen Sie sich meine Bearbeitungsfrage an. Wenn dies jedoch der Fall ist, wird die Zeile über dem Fehler ebenfalls fehlschlagen, aber nicht – RicardoGonzales