我使用ng-table为admin和用户使用相同的控制器,相同的视图但是加载了不同URL的数据,但是从缓存中获取数据时它会从缓存中重新加载数据(我想在用户注销时清除)
调节器
myApp.controller('listArticle', ['$scope', '$filter', 'ngTableParams', 'nameService', '$rootScope', '$location', '$timeout', '$cookieStore', 'flashService', '$templateCache',
function ($scope, $filter, ngTableParams, nameService, $rootScope, $location, $timeout, $cookieStore, flashService, $templateCache)
{
//$templateCache.removeAll();
$scope.success = {};
$scope.article = {};
$scope.article.edit = '-';
$scope.article.approve = '-';
$scope.article.view = 'view';
$scope.showAlert = true;
flashService.displayAlertMessages();
$scope.tableParams = new ngTableParams(
{
page: 1, // show first page
count: 10, // count per page
sorting: {name: 'asc'}
},
{
total: 0, // length of data
getData: function ($defer, params)
{
nameService.getData($defer, params, $scope.filter);
},
counts: [],
paginationMaxBlocks: 13
});
$scope.$watch("filter.$", function ()
{
$scope.tableParams.reload();
});
}]);
Run Code Online (Sandbox Code Playgroud)
服务
myApp.service("nameService",['$http','$filter','$cookieStore', '$rootScope', function($http, $filter, $cookieStore, $rootScope){
function filterData(data, filter)
{
return $filter('filter')(data, filter);
}
function orderData(data, params)
{
return params.sorting() ? $filter('orderBy')(data, params.orderBy()) : filteredData;
}
function sliceData(data, params)
{
return data.slice((params.page() - 1) * params.count(), params.page() * params.count());
}
function transformData(data,filter,params)
{
return sliceData( orderData( filterData(data,filter), params ), params);
}
var service =
{
cachedData:[],
getData:function($defer, params, filter)
{
if(service.cachedData.length>0)
{
var filteredData = filterData(service.cachedData,filter);
transformedData = sliceData(orderData(filteredData,params),params);
params.total(filteredData.length);
$defer.resolve(transformedData);
}
else
{
var id = $cookieStore.get('userId');
if($rootScope.role == 1)
{
var url = "article/serverside/fetch-pending-list.php";
var data = "";
}
else
{
var url = "article/serverside/fetch-list.php";
var data = {id:id};
}
$http.post(url,data)
.success(function(resp)
{
var i=0;
for(i=0; i<resp.length; i++)
{
resp[i].status = parseInt(resp[i].status);
resp[i].category = parseInt(resp[i].category);
if($rootScope.role > 1)
resp[i].edit = (resp[i].status == 1)?"Edit":"";
else{
resp[i].approve = (resp[i].status == "2")?"Approve/Reject":"";
}
var j=0;
var k=0;
for(j=0;j<statusList.length;j++){
if(statusList[j]['id'] == resp[i].status)
resp[i].status = statusList[j]['title'];
}
for(k=0;k<categories.length;k++){
if(categories[k]['id'] == resp[i].category)
resp[i].category = categories[k]['title'];
}
}
angular.copy(resp,service.cachedData);
params.total(resp.length);
var filteredData = $filter('filter')(resp, filter);
transformedData = transformData(resp,filter,params);
$defer.resolve(transformedData);
});
}
}
};
return service;
Run Code Online (Sandbox Code Playgroud)
}]);
注意 if(service.cachedData.length>0)这个地方加载了两个登录的相同数据.也就是说,如果我保存一种形式的数据并重定向到ng-table,列表不会更新,因为它从缓存而不是从源加载数据.
当用户注销时,您应该显式清除cachedData数组,以便新用户将拥有新的缓存对象数组。
或者用key方式存储cachedData。例如
cachedData=[{"user" : '123', 'data':[{}]},
"user" : '234', 'data':[{}]
]
Run Code Online (Sandbox Code Playgroud)
这会增加一些复杂性,因为您需要根据用户 ID 查询缓存数据。
为什么不使用 Angular 缓存服务来自动完成这项工作(即它为不同的 url 创建单独的缓存)。https://github.com/jmdobry/angular-cache
编辑:注销时清除缓存;如果您有身份验证控制器(处理登录和注销操作的控制器)。将 nameService 注入到该控制器中 单击注销时,您可以简单地编写 nameService.cachedData = []。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |