我正在使用Ionic创建一个混合应用程序,它将加载存储在设备上的一些JSON文件。由于相同的数据将用于几种不同的状态,我认为将响应存储到JSON请求并重用它是有意义的,而不是一遍又一遍地重新读取JSON文件。
This question seems to address that scenario,但我似乎无法让它发挥作用。虽然模板在我使用更简单的$ http.get()。success()请求时起作用,但是自从我开始尝试使用此服务以来它永远不会填写。
app.factory('localJsonService', function($http, $q) {
var localJsonService = {};
localJsonService.returnLegislators = function() {
if (this.legislators) {
return $q.when(this.legislators);
}
return $http.get('/data/legislators.json').then(function(response) {
this.legislators = response.data;
return this.legislators;
});
}
return localJsonService;
});
//old malfunctioning controller
app.controller('profileController', function($scope, $stateParams, localJsonService) {
$scope.legislators = localJsonService.returnLegislators();
$scope.legislator = $scope.legislators[$stateParams.seq_no-1];
console.log($scope.legislator); //displays undefined
});
//EDIT: newer, working controller (but still loads JSON file on each new state)
app.controller('profileController2', function($scope, $stateParams, localJsonService) {
localJsonService.getLegislators().then(function(legislators){
$scope.legislator = legislators[$stateParams.seq_no-1];
});
});
这只是对我失踪的服务的一个简单改变吗?或者我完全以错误的方式解决这个问题?我正在运行AngularJS v1.3.13,但我不反对其他版本,如果这样做会有所帮助。
感谢您提供任何帮助。
答案 0 :(得分:2)
使用promise回调并在该回调中分配变量:
localJsonService.returnLegislators().then(function(legislators){
$scope.legislators = legislators;
$scope.legislator = legislators[$stateParams.seq_no-1];
console.log($scope.legislator);
});
答案 1 :(得分:1)
如果服务数据响应没有改变,我宁愿用户localStorage来缓存你的响应。我建议你ngStorage,这样可以很容易地使用localStorage和sessionStorage。
P.S:如果数据正在改变,那么使用sessionStorage,会话持续存在,但在应用程序重启后清除。
注入$ localStorage后的示例:
设置默认值:
var jsonDefaultVariable = {};
jsonDefaultVariable["myDatas"] = false;
$localStorage.$default(jsonDefaultVariable);
检查缓存:
if($localStorage["myDatas"] !== false){
factory.myDatas = $localStorage.myDatas;
}else{
$http(....).success(function(data){
$localStorage.myDatas = data;
factory.myDatas = data;
});