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

AngularJS 1.5.8中为JSON过滤内容添加行号的问题

解决AngularJS 1.5.8中JSON预览添加行号的问题

你可以通过两种实用方式实现这个需求:自定义过滤器(将行号嵌入JSON字符串),或者使用CSS计数器(样式层面添加行号),下面分别详细介绍:

方法一:自定义AngularJS过滤器(行号随内容一起输出)

这种方法会把行号直接整合到JSON字符串里,适合需要复制带行号内容的场景。

1. 定义自定义过滤器

在你的AngularJS模块中添加一个依赖内置json过滤器的自定义过滤器:

angular.module('yourAppName')
.filter('jsonWithLineNumbers', ['$filter', function($filter) {
  return function(input, indentLevel) {
    // 先用内置json过滤器生成格式化的JSON字符串
    var formattedJson = $filter('json')(input, indentLevel);
    if (!formattedJson) {
      return '';
    }
    // 按换行符分割成单独的行
    var lines = formattedJson.split('\n');
    // 为每行添加行号,格式为「行号 | 内容」
    var numberedLines = lines.map(function(line, index) {
      return (index + 1) + ' | ' + line;
    });
    // 重新拼接成完整的带行号字符串
    return numberedLines.join('\n');
  };
}]);

2. 在模板中使用过滤器

把原来的json过滤器替换成自定义的jsonWithLineNumbers即可:

<pre id="previewArea"><code>{{ $ctrl.myObj | jsonWithLineNumbers : 4}}</code></pre>

方法二:使用CSS计数器(样式层面添加行号)

这种方法不会修改JSON字符串本身,行号仅通过CSS渲染实现,适合不需要复制行号的场景,样式与内容分离更清晰。

1. 添加CSS样式

给你的previewArea容器添加以下CSS规则:

#previewArea {
  counter-reset: line-counter; /* 初始化行号计数器 */
  padding-left: 1.5em; /* 给行号预留显示空间 */
}

#previewArea code {
  display: block; /* 让每行单独占一行 */
}

#previewArea code::before {
  counter-increment: line-counter; /* 每行计数器自动+1 */
  content: counter(line-counter) " | "; /* 生成行号内容 */
  color: #666; /* 设置行号为灰色,区分主体JSON内容 */
  display: inline-block;
  width: 40px; /* 固定行号宽度,保证JSON内容对齐整齐 */
  margin-left: -1.5em; /* 向左偏移,对齐到pre容器左侧 */
  text-align: right;
}

2. 保持原有模板不变

不需要修改原来的模板代码,依然使用内置的json过滤器即可:

<pre id="previewArea"><code>{{ $ctrl.myObj | json : 4}}</code></pre>

两种方法对比

  • 自定义过滤器:行号是内容的一部分,复制时会被一同复制;但如果后续要修改行号格式,需要调整JS代码。
  • CSS计数器:样式与内容完全分离,修改行号样式只需调整CSS;复制JSON内容时不会包含行号,适合仅做展示的需求。

你可以根据自己的实际使用场景选择合适的方案~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:55