我正在为不同来源的管理员和用户使用ng-table.作者数据显示在admin中,直到刷新

Abe*_*bel 6 angularjs

我使用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,列表不会更新,因为它从缓存而不是从源加载数据.

Mah*_*esh 1

当用户注销时,您应该显式清除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 = []。