2016-09-23 76 views
1

因此,我创建了一个工厂来查询数据库并返回数据。在该方法内部,我可以打印到控制台。但是当我检查控制器内部的返回数据时,它是空的,请查看下面的代码,看看你能否提供帮助。Ionic不会将sql数据从工厂返回给控制器

这里是工厂

rs.factory("userService",function($http,$ionicLoading,$cordovaProgress,$cordovaSQLite,$q){ 
    var user = {}; 

/**get user data */ 
     user.getData = function(){ 
     //stores from the local database 
     var userData = []; 
     var query = "SELECT * FROM users"; 
     $cordovaSQLite.execute(db, query, []).then(function(res) { 

    for (var i=0; i < res.rows.length; i++){ 
     userData.push(res.rows.item(i)); 
    } 
     console.log("User Data : " + JSON.stringify(userData));//this works 

    }, function (err) { 
     console.error(err); 
    }) 

    return userData; 

}; 
return user; 

}); 

控制器:

angular.module('starter.controllers', []) 
.controller('AppCtrl', function($scope, $ionicModal, $timeout, $http, $state, $cordovaSQLite,$ionicNavBarDelegate,userService) { 

console.log(userService.getData()); // is empty 
}) 

没有在这里返回。

+0

我有一个问题有关。简短的解释:所有的数据库操作都是异步检查http://stackoverflow.com/questions/39563879/sqlite-plugin-for-cordova-code-running-backwards – MikeVelazco

回答

0

1日的事情,你需要从你的诺言的成功回调返回userData,&此后返回$cordovaSQLLite.execute承诺,让你可以在里面控制器答应链

user.getData = function() { 
    //stores from the local database 
    var userData = []; 
    var query = "SELECT * FROM users"; 
    //returning promise 
    return $cordovaSQLite.execute(db, query, []).then(function(res) { 
    for (var i = 0; i < res.rows.length; i++) { 
     userData.push(res.rows.item(i)); 
    }   
    //return data once user Data created 
    return userData; 
    }, function(err) { 
    console.error(err); 
    }) 
}; 

内。然后控制器,你可以通过访问数据。然后功能通过该方法

angular.module('starter.controllers', []) 
.controller('AppCtrl', function($scope, $ionicModal, $timeout, $http, $state, $cordovaSQLite,$ionicNavBarDelegate,userService) { 
    userService.getData().then(function(userData){ 
     console.log(userData); 
    }); 
}) 
相关问题