我已经编写了一个离子应用程序,其中包含一个名为Api的工厂,它处理API调用,另一个名为ldb(本地数据库),使用CordovaSqlite插件处理与本地Sqlite数据库的交互。
当我尝试单独使用任何一个工厂时,它们按预期运行,但是当我尝试在Apis函数中使用ldb时,它不会返回数据。
这是我的ldb代码。请注意db在根作用域中定义为sqlite数据库。
.factory('ldb', function($cordovaSQLite) {
function currentSite(){
return $cordovaSQLite.execute(db,"SELECT * FROM sites WHERE id=1");
}
return{
current: function(){return currentSite()}
}
}
这是我的api代码
.factory('api', function($http,config,ldb) {
function getLastEvent(){
ldb.currentSite().this(function(res){
var siteid = res.rows.item(0).siteid;
var sitepin = res.rows.item(0).sitepin;
if(siteid != null && sitepin != null){
$scope.lastEvent = $http.post(config.apiURL, {siteid: siteid, sitepin: sitepin, action: 'getLastEvent'});
return true;
}
else{ return {"AlertType":"OP","Time":"00:00","Date":"No Site"};}
return {"AlertType":"OP","Time":"00:00","Date":"No Site"};
})
}
return{
lastEvent: function(){return getLastEvent()}
}
我在这样的控制器中调用api。
app.lastEvent().then(function(res){
if(res.data == "Invalid Details Provided!"){$scope.lastEvent = {"AlertType":"OP","Time":"Invalid Login","Date":""};}
else if(res.data != null){ $scope.lastEvent = res.data[0];}
else{$scope.lastEvent ={"AlertType":"OP","Time":"Error","Date":""}}
})
答案 0 :(得分:0)
您的代码中存在一些错误:
in' api'您写的工厂ldb.currentSite().this(...
而不是ldb.current().then(...
。
事实上' ldb' factory返回名为current()
的函数。
此外,请注意,$cordovaSQLite.execute()
是一个异步操作,因此它返回一个方法then()
而非this()
的承诺。
最后你说db在" root范围中被定义":你的意思是什么?它是$ rootScope的属性?如果是,则必须使用$ rootScope.db引用它。