Javascript angularjs中工厂方法的空数组
场景:我有一个具有以下代码的工厂服务Javascript angularjs中工厂方法的空数组,javascript,angularjs,sqlite,ionic-framework,factory,Javascript,Angularjs,Sqlite,Ionic Framework,Factory,场景:我有一个具有以下代码的工厂服务 appServices.factory('MyDB', function ($cordovaSQLite) { var FixedCache = []; return { getFromCache: function (dataURL, $scope) { var query = "SELECT * FROM FixedCache WHERE URI_ID = '"+dataURL+"'";
appServices.factory('MyDB', function ($cordovaSQLite)
{
var FixedCache = [];
return {
getFromCache: function (dataURL, $scope)
{
var query = "SELECT * FROM FixedCache WHERE URI_ID = '"+dataURL+"'";
FixedCache = [];
$scope.dataFromCache = [];
//console.log("Inside Cache method");
// Execute query statement from query variable.
$cordovaSQLite.execute(db, query).then(function (res)
{
if (res.rows.length > 0)
{
var dataItem = {
id : res.rows.item(0).id ,
URI_ID : res.rows.item(0).URI_ID ,
ExpireDate : res.rows.item(0).ExpireDate ,
JSONData : res.rows.item(0).JSONData
};
FixedCache.push(dataItem);
$scope.dataFromCache = FixedCache;
}
});
return FixedCache;
},// End select all data.
};
})
在控制器中,我希望通过调用此方法来获取数据。这是控制器的代码
appControllers.controller('categoriesCtrl', function ($scope, $http, $state, $timeout, $stateParams, $ionicHistory, MyDB, UtilityMethods) {
var dataURL = window.globalVariable.constants.URL_API;
$scope.initialForm = function () {
$scope.categoriesFromCache = [];
$scope.categoryCache;
$scope.url = window.globalVariable.constants.URL_API;
$scope.todaysDate = UtilityMethods.GetDate(0);
// $scope.isLoading is the variable use for loading.
$scope.isLoading = false;
$scope.apiUrl = window.globalVariable.constants.URL_API;
};// End initialForm.
$scope.GetFromCache = function (uri, $scope) {
$scope.dataFromCache = [];
MyDB.getFromCache(uri, $scope);
};
$scope.navigateTo = function (targetPage, objectData, apiUrl) {
$state.go(targetPage, {
category: objectData,
apiUrl: apiUrl
});
};
$scope.clearSearch = function() {
$scope.searchByName = '';
};
$scope.goBack = function () {
$ionicHistory.nextViewOptions({
disableBack: true
});
$state.go("app.categories", {
isShowError: false
});
};
$scope.initialForm();
$timeout(function () {
$scope.GetFromCache(dataURL, $scope);
}, 3000);// End loading progress.
}))
问题:
当我调用这个方法MyDB.getFromCache(uri,$scope)时;在控制器中,它返回空数组[]
数据库不包含这些数据
请引导我。调用函数是否正确?代码不起作用的原因是,您正在考虑异步事件以同步方式工作,但我想说的是,将
$scope
作为参数传递给工厂方法并不被视为良好做法
基本上,您需要做的是从控制器内承诺的方法和链返回cordovapromise
,并在其中设置范围变量
工厂
getFromCache: function(dataURL) {
var query = "SELECT * FROM FixedCache WHERE URI_ID = '" + dataURL + "'";
FixedCache = [];
//returning cordova promise
return $cordovaSQLite.execute(db, query).then(function(res) {
if (res.rows.length > 0) {
var dataItem = {
id: res.rows.item(0).id,
URI_ID: res.rows.item(0).URI_ID,
ExpireDate: res.rows.item(0).ExpireDate,
JSONData: res.rows.item(0).JSONData
};
FixedCache.push(dataItem);
return FixedCache; //return data to chained promise
}
});
}
控制器
$scope.GetFromCache(dataURL).then(function(data){
$scope.dataFromCache = data;
});
代码不起作用的原因是,您正在考虑异步事件以同步方式工作,尽管我想说的是,将
$scope
作为参数传递给工厂方法并不是一种好的做法
基本上,您需要做的是从控制器内承诺的方法和链返回cordovapromise
,并在其中设置范围变量
工厂
getFromCache: function(dataURL) {
var query = "SELECT * FROM FixedCache WHERE URI_ID = '" + dataURL + "'";
FixedCache = [];
//returning cordova promise
return $cordovaSQLite.execute(db, query).then(function(res) {
if (res.rows.length > 0) {
var dataItem = {
id: res.rows.item(0).id,
URI_ID: res.rows.item(0).URI_ID,
ExpireDate: res.rows.item(0).ExpireDate,
JSONData: res.rows.item(0).JSONData
};
FixedCache.push(dataItem);
return FixedCache; //return data to chained promise
}
});
}
控制器
$scope.GetFromCache(dataURL).then(function(data){
$scope.dataFromCache = data;
});
@我很高兴能帮助你,谢谢:-)我真的很高兴我得到了答案。我是Angularjs的新手。从工厂提取数据时,仍然使用加载程序:)正在处理它。这里的加载程序是什么意思?从DB加载数据时,至少需要一秒钟左右的时间。另外,当通过http请求获取数据时,需要几秒钟的时间,因此需要在请求期间显示加载程序。你们是如何得到关于堆栈溢出的问题的通知的。我很快得到了你的答复。@Abubaker很高兴帮助你,谢谢:-)我真的很高兴得到了答案。我是Angularjs的新手。从工厂提取数据时,仍然使用加载程序:)正在处理它。这里的加载程序是什么意思?从DB加载数据时,至少需要一秒钟左右的时间。另外,当通过http请求获取数据时,需要几秒钟的时间,因此需要在请求期间显示加载程序。你们是如何得到关于堆栈溢出的问题的通知的。我很快得到你的答复。