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

如何在Ember模板中渲染含{{action}}的HTML文本使其生效?

解决Ember动态HTML中动作无法触发的问题

Ember 的 {{{}}} 语法仅会渲染纯 HTML 内容,不会解析其中的 Ember 模板语法(比如 {{action}}),所以你用计算属性返回带动作的 HTML 字符串,渲染后动作只会显示成文本,无法绑定事件。下面是可行的解决方案:

方案一:直接在模板中编写(推荐)

如果链接的参数或文本是动态的,直接在模板中结合组件/控制器的属性来写,Ember 会正常编译并绑定动作:

{{!-- 固定参数写法 --}}
<a {{action 'runService' 15001}} href="#">Click Here</a>

{{!-- 动态参数写法,假设 serviceId 是组件/控制器的属性 --}}
<a {{action 'runService' this.serviceId}} href="#">{{this.linkText}}</a>

方案二:用组件封装动态结构

如果需要更灵活的动态生成逻辑,推荐用组件来封装链接和动作:

  1. 创建组件 service-link,模板内容:
<a {{action 'triggerService' @serviceId}} href={{@linkHref}}>{{@linkText}}</a>
  1. 组件类代码:
import Component from '@glimmer/component';
import { action } from '@ember/object';

export default class ServiceLinkComponent extends Component {
  @action
  triggerService(serviceId) {
    // 调用传入的父组件动作
    this.args.onRunService?.(serviceId);
  }
}
  1. 在使用的模板中调用组件:
<ServiceLink 
  @serviceId={{15001}} 
  @linkText="Click Here" 
  @linkHref="#" 
  @onRunService={{action 'runService'}} 
/>

为什么原方法无效?

Ember 在初始化阶段会提前编译模板中的语法(包括 {{action}}),将其转换为对应的事件绑定逻辑。而通过计算属性返回的 HTML 字符串是在渲染阶段才插入的,不会经过 Ember 的模板编译流程,所以 {{action}} 会被当作普通文本处理,无法触发动作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:05:31