资讯详情

资讯详情

ng-table 源码架构深度剖析:NgTableParams 核心类与数据处理流水线全解读

ng-table 源码架构深度剖析NgTableParams 核心类与数据处理流水线全解读【免费下载链接】ng-tableSimple table with sorting and filtering on AngularJS项目地址: https://gitcode.com/gh_mirrors/ng/ng-tableng-table是 AngularJS 生态中最流行的表格组件提供排序、过滤、分页和分组能力。这篇文章带你深入 ng-table 源码重点拆解核心类NgTableParams以及它驱动的数据处理流水线过滤 → 排序 → 分页 → 拦截器帮你彻底搞懂一张 ng-table 表格背后的数据是怎么流动的。一、整体架构两个模块的分工ng-table 的源码位于 src/ 目录分为两大模块模块路径职责ng-table-coresrc/core/无 UI 依赖的核心逻辑参数、设置、事件、数据管道ng-table-browsersrc/browser/面向浏览器的指令与控制器ng-table、ng-table-column等核心模块在 src/core/index.ts 中注册了四个关键服务ngTableDefaultGetData—— 默认数据获取函数流水线主体ngTableDefaults—— 全局默认配置ngTableEventsChannel—— 事件总线NgTableParams—— 本文主角每个表格实例的参数管理器二、NgTableParams表格的大脑所有状态管理都集中在 NgTableParams 类中它由两部分构成1. 参数值ParamValuesParamValues 描述了当前显示哪一段数据的五个维度属性含义默认值page当前页码从 1 开始1count每页行数10filter过滤条件空sorting排序字段与方向空group分组字段空这些值通过page()、count()、filter()、sorting()、group()这组读写同名的方法访问——无参调用为读取带参调用为设置count 方法 是典型示例。2. 设置值SettingsSettings 类则描述数据从哪来、怎么处理dataset原始数据数组、getData数据获取函数、interceptors拦截器数组、filterOptions、dataOptions等。三、reload()流水线如何被触发reload()是整条流水线的总开关reload 方法它做了四件事置位加载状态$loading true并保存当前参数的快照memento选择数据源若有分组则调用getGroups否则调用getData进入拦截器管道将返回的 Promise 依次穿过interceptors提交结果成功后写入this.data、发布afterReloadData事件、刷新分页按钮失败则记录错误快照hasErrorState()可用于检测。而谁来调用reload()答案是浏览器层的 ngTableController.ts$scope.$watch(params.isDataReloadRequired(), ...)isDataReloadRequired()通过比较当前参数与上次提交时的快照prevParamsMemento来判断是否需要重新取数。也就是说任何参数或 dataset 的变更 → watch 感知 → reload() → 流水线执行 → data 更新 → 视图重绘形成闭环。四、数据处理流水线过滤 → 排序 → 分页默认的getData由 NgTableDefaultGetDataProvider 提供其核心 getData 函数 严格遵循三步流水线dataset ──▶ applyFilter ──▶ applySort ──▶ applyPaging ──▶ 本页数据 (afterDataFiltered) (afterDataSorted) (写入 total)applyFilter先判断hasFilter()没有有效过滤条件则直接跳过否则用setPath支持a.b.c形式的嵌套属性过滤再调用 Angular 的$filter可通过filterOptions.filterFn自定义算法applySort把sorting转换成 Angular$orderBy能识别的格式后排序applyPaging按(page-1) * count切片取出本页数据并调用params.total(data.length)回写总数供分页器计算。三步均可通过 DataSettings 的applyFilter / applySort / applyPaging开关关闭——这对服务端已分页的场景非常有用。每步完成后还会通过事件总线发布afterDataFiltered/afterDataSorted事件供外部订阅。五、拦截器管道类 Axios 的后处理机制getData返回的 Promise 会进入 runInterceptorPipeline。Interceptor 接口与 Axios 风格一致response(data, params)—— 对成功结果做转换如统一包装数据结构responseError(reason, params)—— 对失败做兜底如统一错误处理多个拦截器通过Promise.reduce依次串联形成一条可插拔的后处理管道。六、事件总线松耦合的观察者网络NgTableEventsChannel 基于 Angular$rootScope.$broadcast实现了强类型发布/订阅内置六种事件事件触发时机afterCreatedNgTableParams 实例构造完成datasetChanged替换了 dataset 数组afterReloadDatareload 成功拿到新数据pagesChanged分页按钮组变化afterDataFiltered过滤完成afterDataSorted排序完成每个onXxx订阅都支持传入事件过滤器指定实例或判断函数返回值是取消订阅函数还能绑定$scope实现自动销毁避免内存泄漏。七、总结一张图看懂数据流用户操作(点表头/输入过滤框/翻页) │ ▼ NgTableParams.page()/filter()/sorting()/group() │ ▼ isDataReloadRequired() 返回 true ← $watch 监听 │ ▼ reload() ──▶ getData / getGroups │ ▼ 过滤 → 排序 → 分页可被 dataOptions 关闭 │ ▼ 拦截器管道response/responseError │ ┌────────┼────────┐ ▼ ▼ ▼ this.data total 事件广播(afterReloadData 等) │ ▼ 浏览器指令重绘表格理解了NgTableParams状态中心 Settings行为配置 默认管道filter/sort/paging 拦截器后处理 事件总线解耦这五大件你基本就读通了 ng-table 的核心源码。相关单元测试可参考 test/specs/ 目录下的tableParams.spec.ts与ngTableDefaultGetData.spec.ts动手验证你的理解。【免费下载链接】ng-tableSimple table with sorting and filtering on AngularJS项目地址: https://gitcode.com/gh_mirrors/ng/ng-table创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →