我不是Angular的专业人士而且仍在学习。希望我能在这里得到一些帮助。
我想构建一个具有不同视图的应用。我需要检测浏览器并从服务器获取一些数据。为此我创建了一项服务,我在这里工作。
我的愿望是使用服务所有视图的数据。如何正确存储和缓存数据,以便我可以在我的所有视图/控制器中使用它? 这是我到目前为止所得到的。
我的服务:
.factory('DataService', function($http, $q, $timeout) {
var data = { };
return {
notes: function() {
// This exposed private data
return data;
},
addItem: function(itemname, itemvalue) {
// This is a public function that modifies private data
data[itemname] = itemvalue;
}
getPlatform: function() {
var getPlatformData = function() {
var deferred = $q.defer();
BrowserDetect.init();
deferred.resolve(BrowserDetect.OS);
return deferred.promise;
};
return {
getPlatformData: getPlatformData
};
},
getServerData: function() {
//if(!data.getServerData){
var getData = function() {
var deferred = $q.defer();
$http({
url: 'js/fakeGet.json',
method: 'get',
dataType: 'json',
}).success(function(data) {
data.scanResponse = data;
deferred.resolve(data);
})
return deferred.promise;
};
return {
getData: getData
};
//}
// return data.scanResponse;
}
};
});
我的控制器:
DataService.getPlatform().getPlatformData().then(function(platform) {
console.log('Another browserDetect request');
$scope.platform = platform;
DataService.addItem("platform", $scope.userPlatform);
});
答案 0 :(得分:3)
首先,正如nordyke在他的回答中所提到的,你最好将服务拆分为较小的服务。
其次,您正在询问如何缓存数据,因为您正在使用承诺,$q.when()
就是您所需要的。我将以getPlatform
为例让您入门:
.factory('DataService', function($http, $q, $timeout) {
var os; // this variable is used to store the result
return {
getPlatform: function() {
var getPlatformData = function() {
if (!os) { // no previous data available, look into other service to fetch the data
var deferred = $q.defer();
BrowserDetect.init();
os = BrowserDetect.OS; // store data
deferred.resolve(os);
return deferred.promise;
}
return $q.when(os); // there is previous data, return it as promise
};
return {
getPlatformData: getPlatformData
};
}
};
});
通过这种方式,可以缓存OS信息,
DataService.getPlatform().getPlatformData().then(function(platform) {
...
});
只会在DataService的生命周期内获取一次平台信息。您也可以将相同的想法应用于getServerData
以缓存来自服务器的数据。
答案 1 :(得分:1)
在服务单例中缓存数据是一种很好的方法,我喜欢你直接实现它。我唯一的建议是将您的3个问题分成单独的服务。