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

如何在AngularJS模板中对{{@key}}执行字符串截取?

问题

我是TypeScript和AngularJS的新手,当前使用如下代码渲染一系列<div>元素:

{{#if styles}}
  <h2 class="box-header">Styles</h2>
  <div class="box">
  {{#each styles}}
    <div class="item">
      {{#if thumbnail}}
        <img src="{{public_url}}styles/{{@key}}/{{thumbnail}}{{&../key_query}}" alt="{{name}} preview" />
      {{else}}
        <img src="{{public_url}}images/placeholder.png{{&key_query}}" alt="{{name}} preview" />
      {{/if}}
      <div class="details">
        <h3>{{name}}</h3>
        <p class="identifier">identifier: {{@key}}</p>
      </div>
    </div>
  {{/each}}
  </div>
{{/if}}

其中标识符行<p class="identifier">identifier: {{@key}}</p>的HTML输出值包括:

identifier: base_name
identifier: example_000_0_name_1
identifier: example_000_1_name_2
identifier: example_000_2_name_3
identifier: example_000_3_name_4
identifier: example_000_4_name_5

我希望生成HTML时移除example_000_[n]_前缀,预期输出为:

identifier: base_name
identifier: name_1
identifier: name_2
identifier: name_3
identifier: name_4
identifier: name_5

尝试在{{}}中直接调用字符串方法(比如{{@key.substr(3)}}、{{("" + @key).substr(3)}})均出现解析错误:

  • 尝试{{@key.substr(3)}}的错误信息:
Error: Parse error on line 35:
...>identifier: {{@key.substr(3)}}</p>    
-----------------------^
Expecting 'ID', got 'INVALID'
  • 尝试{{("" + @key).substr(3)}}的错误信息:
Error: Parse error on line 35:
...fier">identifier: {{("" + @key).substr(3
-----------------------^
Expecting 'ID', 'STRING', 'NUMBER', 'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', got 'OPEN_SEXPR'

请问如何在<p class="identifier">identifier: {{@key}}</p>中对{{@key}}执行字符串截取?

解决方案

你用的是Handlebars模板语法,原生Handlebars不支持直接在模板内调用JS原生字符串方法,需要用以下两种方式解决:

方法1:自定义Handlebars助手函数

在JS代码里注册一个自定义助手,专门处理@key的前缀截取逻辑:

// 注册自定义字符串处理助手
Handlebars.registerHelper('trimKeyPrefix', function(key) {
  // 用正则匹配并移除指定前缀
  return key.replace(/^example_000_\d+_/, '');
});

然后在模板中调用这个助手:

<p class="identifier">identifier: {{trimKeyPrefix @key}}</p>

方法2:预处理数据后再渲染

在把styles数据传给模板之前,提前处理每个键的名称,生成一个干净的字段:

// 假设styles是待渲染的原始对象
const processedStyles = {};
Object.keys(styles).forEach(key => {
  let cleanKey = key;
  // 移除指定前缀
  if (key.includes('example_000_')) {
    cleanKey = key.replace(/^example_000_\d+_/, '');
  }
  // 保留原数据,新增cleanKey字段
  processedStyles[key] = { ...styles[key], cleanKey };
});
// 后续将processedStyles传入模板渲染

之后直接在模板中使用预处理好的字段:

<p class="identifier">identifier: {{cleanKey}}</p>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:22:46