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

Angular14升级后charts.js自动化测试__ngContext__取数失效咨询

__ngContext__返回整数的原因

__ngContext__本身是Angular的内部私有属性,从未对外承诺过API稳定性,框架版本迭代时可以任意修改实现逻辑。
Angular 14对生产环境的上下文存储逻辑做了优化:不再直接把完整的上下文对象引用挂载到DOM元素的__ngContext__属性上,而是只存储一个整数类型的索引ID,完整的上下文对象统一存在Angular框架初始化时创建的全局存储数组中。这个改动主要是为了减少DOM节点持有的引用大小,降低内存泄漏概率,同时压缩生产包体积。

无源码客户端侧获取Charts.js图表数据的可行方法
  • 优先使用Charts.js官方API获取实例,稳定性最高,不依赖框架内部实现:
    Chart.js原生提供了静态方法获取绑定在指定canvas上的图表实例,不需要绕Angular上下文:
    // 定位到图表对应的canvas元素
    const chartCanvas = document.querySelector('chart-dataset canvas');
    // 直接获取图表实例
    const chartInstance = Chart.getChart(chartCanvas);
    // 读取完整图表数据
    const chartData = chartInstance.data;
    
  • 通过__ngContext__的索引ID映射回真实上下文对象:
    如果你之前的逻辑强依赖ngContext里的内容,可以通过DOM上拿到的整数ID,从Angular全局存储里捞出真实的上下文对象:
    const chartEl = document.getElementsByTagName('chart-dataset')[0];
    const ctxIndex = chartEl.__ngContext__;
    // 遍历window找到Angular的全局上下文存储数组
    const ngContextStore = Object.values(window).find(item => {
      return Array.isArray(item) && item[ctxIndex] && typeof item[ctxIndex] === 'object';
    });
    const realNgContext = ngContextStore[ctxIndex];
    // 后续按照你之前的逻辑从realNgContext中提取目标数据即可
    
  • 提前拦截Charts.js构造函数捕获所有实例:
    如果页面加载时机可控,可以在页面业务代码加载前注入脚本,重写Chart构造函数,把所有初始化的图表实例缓存到自定义全局变量里,后续直接读取缓存即可,完全不受框架升级影响:
    // 该脚本需要在页面Chart.js加载完成后、业务代码初始化图表前执行
    window._chartCache = [];
    const OriginChart = window.Chart;
    window.Chart = function(...args) {
      const ins = new OriginChart(...args);
      window._chartCache.push(ins);
      return ins;
    }
    // 复制原Chart的所有静态属性/方法,避免影响原有逻辑
    Object.keys(OriginChart).forEach(key => {
      window.Chart[key] = OriginChart[key];
    });
    

注意:所有依赖Angular内部私有属性、全局未公开存储的方法都可能在后续版本升级中失效,生产环境自动化脚本优先使用第三方库官方暴露的公开API。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:57:31