Angular Factory不工作

时间:2014-08-14 13:24:36

标签: javascript angularjs ionic-framework

我尝试使用从this demo

修改的后续代码为我的应用程序提供持久性服务
 /* global angular,window */
var ionicApp = angular.module('ionicApp', []);

ionicApp.factory('persistanceService', ['$q', function($q) {

    var setUp=false;
    var db;

    function init() {
        var deferred = $q.defer();

        if(setUp) {
            deferred.resolve(true);
            return deferred.promise;
        }

        var openRequest = window.indexedDB.open("indexeddb_angular",1);

        openRequest.onerror = function(e) {
            console.log("Error opening db");
            console.dir(e);
            deferred.reject(e.toString());
        };

        openRequest.onupgradeneeded = function(e) {

            var thisDb = e.target.result;
            var objectStore;

            //Create produto OS
            if(!thisDb.objectStoreNames.contains("produto")) {
                var produto = thisDb.createObjectStore('produto', {keyPath: 'id'});
                produto.createIndex('nome_idx', 'nome', {unique: false});
                produto.createIndex('quantidade_idx', 'quantidade', {unique: false});
                produto.createIndex('categoria_idx', 'categoria', {unique: false});
                produto.createIndex('quantidade_lista_idx', 'quantidade_lista', {unique: false});
                produto.createIndex('data_validade_idx', 'data_validade', {unique: false});
                produto.createIndex('lista_automatico_idx', 'lista_automatico', {unique: false});               
            }

        };

        openRequest.onsuccess = function(e) {
            db = e.target.result;

            db.onerror = function(event) {
                // Generic error handler for all errors targeted at this database's
                // requests!
                deferred.reject("Database error: " + event.target.errorCode);
            };

            setUp=true;
            deferred.resolve(true);

        };  

        return deferred.promise;
    }

    function isSupported() {
        return ("indexedDB" in window);     
    }

    function deleteProduto(key) {
        var deferred = $q.defer();
        var t = db.transaction(["produto"], "readwrite");
        var request = t.objectStore("produto").delete(key);
        t.oncomplete = function(event) {
            deferred.resolve();
        };
        return deferred.promise;
    }

    function getProduto(key) {
        var deferred = $q.defer();

        var transaction = db.transaction(["produto"]);  
        var objectStore = transaction.objectStore("produto");  
        var request = objectStore.get(key);  

        request.onsuccess = function(event) {  
            var produto = request.result;
            deferred.resolve(produto);
        }; 

        return deferred.promise;
    }

    function getProdutos() {
        var deferred = $q.defer();

        init().then(function() {

            var result = [];

            var handleResult = function(event) {  
                var cursor = event.target.result;
                if (cursor) {
                    result.push({key:cursor.key, title:cursor.value.title, updated:cursor.value.updated});
                    cursor.continue();
                }
            };  

            var transaction = db.transaction(["produto"], "readonly");  
            var objectStore = transaction.objectStore("produto");
            objectStore.openCursor().onsuccess = handleResult;

            transaction.oncomplete = function(event) {
                deferred.resolve(result);
            };

        });
        return deferred.promise;
    }

    function ready() {
        return setUp;
    }

    function saveProduto(produto) {
        //Should this call init() too? maybe
        var deferred = $q.defer();

        if(!produto.id) produto.id = "";


        var t = db.transaction(["produto"], "readwrite");

        if(produto.id === "") {
            t.objectStore("produto")
                            .add({"id": Guid.raw(),
                                    "nome": produto.nome,
                                    "quantidade": produto.quantidade,
                                    "categoria": produto.categoria,
                                    "data_validade": produto.data_validade,
                                    "quantidade_lista": produto.quantidade_lista,
                                    "lista_automatico": produto.lista_automatico});
        } else {
            t.objectStore("produto")
                            .put({"id": Guid.raw(),
                                    "nome": produto.nome,
                                    "quantidade": produto.quantidade,
                                    "categoria": produto.categoria,
                                    "data_validade": produto.data_validade,
                                    "quantidade_lista": produto.quantidade_lista,
                                    "lista_automatico": produto.lista_automatico});
        }

        t.oncomplete = function(event) {
            deferred.resolve();
        };

        return deferred.promise;
    }

    function supportsIDB() {
        return "indexedDB" in window;   
    }

    return {
        isSupported:isSupported,
        deleteproduto:deleteproduto,
        getproduto:getproduto,
        getprodutos:getprodutos,
        ready:ready,
        saveproduto:saveproduto,
        supportsIDB:supportsIDB
    };

}]);

这是我试图在我的控制器中使用它的地方。

angular.module('ionicApp', ['ionic'])

.config(function($stateProvider, $urlRouterProvider) {

  $stateProvider
    .state('tabs', {
      url: "/tab",
      abstract: true,
      templateUrl: "tabs.html"
    })
    .state('tabs.home', {
      url: "/home",
      views: {
        'home-tab': {
          templateUrl: "home.html",
          controller: 'HomeTabCtrl'
        }
      }
    })
    .state('tabs.produto', {
      url: "/produto",
      views: {
        'home-tab': {
          templateUrl: "produto.html",
          controller: 'ProdutoController'
        }
      }
    })    
    .state('tabs.facts', {
      url: "/facts",
      views: {
        'home-tab': {
          templateUrl: "facts.html"
        }
      }
    })
    .state('tabs.facts2', {
      url: "/facts2",
      views: {
        'home-tab': {
          templateUrl: "facts2.html"
        }
      }
    })
    .state('tabs.about', {
      url: "/about",
      views: {
        'about-tab': {
          templateUrl: "about.html"
        }
      }
    })
    .state('tabs.navstack', {
      url: "/navstack",
      views: {
        'about-tab': {
          templateUrl: "nav-stack.html"
        }
      }
    })
    .state('tabs.contact', {
      url: "/contact",
      views: {
        'contact-tab': {
          templateUrl: "contact.html"
        }
      }
    });


   $urlRouterProvider.otherwise("/tab/home");

})

.controller('HomeTabCtrl', function($scope) {
  console.log('HomeTabCtrl');
})
.controller('ProdutoController', function($scope, persistanceService){


console.log('HomeTabCtrl');


});

所以我收到此错误消息:错误:[$ injector:unpr]未知提供者:persistanceServiceProvider< - persistanceService

我不知道为什么要添加sufix。

感谢您的关注。

2 个答案:

答案 0 :(得分:2)

上面有两个代码块,第一个代码:

var ionicApp = angular.module('ionicApp', []);

和第二个:

angular.module('ionicApp', ['ionic'])

这两个语句创建一个模块,无论哪一个先执行都应该保持不变,而第二个不应该有数组参数。

angular.module(NAME, array) //creates a module
angular.module(NAME) //gets a references to a module

答案 1 :(得分:0)

您对ionicApp的定义有两次,将第二个更改为:

 ionicApp.config(function($stateProvider, $urlRouterProvider) {

      $stateProvider
        .state('tabs', {
          url: "/tab",
          abstract: true,
          templateUrl: "tabs.html"
        })
        .state('tabs.home', {
          url: "/home",
          views: {
            'home-tab': {
              templateUrl: "home.html",
              controller: 'HomeTabCtrl'
            }
          }
        })
       .....