我正在制作一个网络应用程序并同时学习AngularJS,但是在存储整个应用程序所需的数据时遇到了问题。在我的一个控制器中,我有一个POST调用,它返回一个JSON对象,其中包含我在应用程序的不同部分中需要的数据,我不知道如何存储整个JSON对象,以便我以后可以访问它。如何存储JSON对象以便稍后可以在其他控制器中访问它?我是否应该打扰这样做,或者我是否应该稍后再发一个POST请求以获取我当时需要的数据(发出POST / GET请求是否很昂贵)?
答案 0 :(得分:1)
您当然不希望继续对相同数据发出POST请求(假设它没有更改)。
您可以将它存储在$ rootScope上,将$ rootScope传递给任何控制器需要访问数据并通过以下方式访问:
var whatever = $rootScope.yourObject;
示例:
//Assuming a controller makes the POSt request (not in app.run etc)
function yourController($rootScope, $http) {
$http.post("desired/url", { params: "foo-bar"}).then(function(response){
//Check for errorz etc.
$rootScope.yourObject = response.data; //Assign to rootscope
});
}
function someOtherController($rootScope){
//Fetch the item from $rootScope, assuming the POST request was
// already made.
var valueFromPreviousRequest = $rootScope.yourObject;
}
答案 1 :(得分:0)
最佳方法是使用自定义服务层进行数据提取,并避免在控制器中使用$http
。在这种情况下,添加缓存机制非常容易。
例如,简单的服务:
app.factory('stats', function($q, $http) {
// Hold cache in local variable
var cache = null;
return {
load: function() {
return cache ? $q.when(cache) : $http.get(statsUrl).then(function(response) {
cache = response.data;
return data;
});
}
};
});
然后你可以在控制器中使用这样的服务:
app.controller('someController', function(stats) {
stats.load().then(function(data) {
console.log(data);
});
});
注意,service load
方法在两种情况下都返回promise object:缓存何时可用以及尚未加载任何数据(第一次调用)。