好的,这可能是一个很长的帖子,但请不要点击,你可能知道一个简单的答案。
案例:
假设您已经构建了一个角度应用程序,人们登录系统会执行某些操作,然后可能会再次注销。应用程序将使用工厂和服务从API收集数据,为了使application
加载更快,您可以将这些数据保存在以下变量中:
app.factory("divisionService", function (api, $http, $q) {
var division = {};
var divisionArray = [];
var mergedUserList = [];
return {
getList: function () {
var d = $q.defer();
if (divisionArray <= 0) {
$http.get(api.getUrl('divisionWithUsers', null))
.success(function (response) {
divisionArray = response;
d.resolve(divisionArray);
});
}
if (divisionArray.length > 0) {
d.resolve(divisionArray);
}
return d.promise;
},
这将确保如果用户尝试使用使用divisionService
的控制器,则该用户将立即获取已获取的数据。
问题:
现在用户登录并且另一个用户登录(不刷新/重新加载)页面。一旦控制器调用此工厂,它已经认为它具有正确的列表,这意味着返回将与之前的用户相同,但是这些数据可能不正确!
由于所有角度服务都是singletons
,因此即使应该注销,服务也不会被破坏。
显而易见的答案
这个问题的答案可能是:“那么就不要将数据存储在变量中”,因为这会产生大量数据,可能会使页面内容加载缓慢。
所以我的问题是你在上述情况下做了什么?你是否真的必须处理每次请求时加载数据或angular
提供解决此问题的智能方法?
答案 0 :(得分:3)
clear()
函数向clear()
工厂添加divisionService
函数,该工厂负责清空缓存的数据结构(数组,对象......)
app.factory("divisionService", function () {
var division = {};
var divisionArray = [];
var mergedUserList = [];
return {
clear: function(){
// Clear the cached data
for (var key in division)
{
delete division[key];
}
divisionArray.length = 0;
// ...
},
getList: ...
}
});
在您退出时从调用此功能
function logout(){
divisionService.clear();
}
如果您不想处理清除缓存数据(例如调用divisionService.clear()
)
function logout(){
$window.location.reload();
}
这将导致重新加载整个应用程序,并且将清除所有临时(基于变量的)缓存数据
答案 1 :(得分:1)
马克,
我的第一个想法就是跑步 divisionArray = [];
注销时。如果有效,请告诉我。如果没有,我会进一步调查。
答案 2 :(得分:1)
您也可以缓存用户信息并进行比较,以确定用户是否已更改,然后再决定刷新数据。