我编写了一个带有两个工厂的离子应用程序,一个名为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":""}}
})
1 回答
您的代码中存在一些错误:在'api'工厂中,您编写了
ldb.currentSite().this(...
而不是ldb.current().then(...
.实际上'ldb'工厂返回一个名为
current()
的函数 .另外,请注意,
$cordovaSQLite.execute()
是一个异步操作,因此它返回一个方法then()
而不是this()
的promise .最后你说db是在“根范围”中定义的:你的意思是什么?它是$ rootScope的属性?如果是,则必须使用$ rootScope.db引用它 .