You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AngularJS(1.x)中切换页面时维持ui-grid分页状态?

解决AngularJS 1.x ui-grid分页状态保留问题

要实现切换视图时保留ui-grid的分页状态(当前页码、每页条数),核心思路是用单例服务存储分页信息——AngularJS的服务是全局单例,不会随视图销毁而丢失数据;如果需要刷新页面也保留状态,可结合localStorage实现持久化。

步骤1:创建分页状态存储服务

这个服务负责保存和读取分页信息,可选加入localStorage支持实现持久化:

angular.module('yourApp').factory('GridPaginationService', function() {
  // 单个grid用固定key,多个grid可改成动态传入key避免冲突
  var storageKey = 'userListGridPagination';
  // 初始化状态:优先从localStorage读取,无数据则用默认值
  var paginationState = JSON.parse(localStorage.getItem(storageKey)) || {
    pageNumber: 1,
    pageSize: 10
  };

  // 持久化到localStorage的辅助方法
  function persistState() {
    localStorage.setItem(storageKey, JSON.stringify(paginationState));
  }

  return {
    // 返回状态副本,避免直接修改内部数据
    getState: function() {
      return angular.copy(paginationState);
    },
    // 更新状态并持久化
    setState: function(newState) {
      paginationState.pageNumber = newState.pageNumber;
      paginationState.pageSize = newState.pageSize;
      persistState();
    }
  };
});

步骤2:在列表页控制器中集成服务

在grid所在的控制器里,初始化时恢复之前的分页状态,同时监听分页变化并实时保存到服务:

angular.module('yourApp').controller('UserListController', function($scope, GridPaginationService) {
  // 初始化grid基础配置
  $scope.gridOptions = {
    paginationPageSizes: [10, 20, 50],
    paginationPageSize: GridPaginationService.getState().pageSize,
    enablePaginationControls: true,
    // 其他grid配置(列定义、数据绑定等)...
  };

  // 注册grid API,处理分页状态
  $scope.gridOptions.onRegisterApi = function(gridApi) {
    $scope.gridApi = gridApi;

    // 监听页码/每页条数变化,实时保存状态并重新加载数据
    gridApi.pagination.on.paginationChanged($scope, function(newPage, pageSize) {
      GridPaginationService.setState({
        pageNumber: newPage,
        pageSize: pageSize
      });
      loadGridData(newPage, pageSize);
    });

    // 页面初始化时,恢复之前的分页状态并加载对应数据
    var savedState = GridPaginationService.getState();
    if (savedState.pageNumber > 1) {
      gridApi.pagination.seek(savedState.pageNumber);
      loadGridData(savedState.pageNumber, savedState.pageSize);
    } else {
      loadGridData(1, savedState.pageSize);
    }
  };

  // 封装数据加载方法,根据分页参数请求对应数据
  function loadGridData(pageNum, pageSize) {
    // 替换成你的实际数据请求逻辑
    // yourDataService.fetchUsers(pageNum, pageSize)
    //   .then(function(response) {
    //     $scope.gridOptions.data = response.data.items;
    //     $scope.gridOptions.totalItems = response.data.totalCount; // 设置总数据量
    //   });
  }
});

关键注意事项

  • 多grid场景下,需修改服务为支持传入唯一key的形式,避免不同grid的分页状态互相覆盖。
  • 数据加载逻辑必须和分页状态绑定,每次视图切换或分页变化时,都要根据当前页码和每页条数请求对应数据。
  • 若不需要刷新页面保留状态,可去掉服务中的localStorage相关代码,仅用内存存储状态即可。

内容的提问来源于stack exchange,提问作者user23247200

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:40:08