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

Ember组件如何传递动作至路由/控制器触发删除操作?

我来帮你搞定这个Ember组件触发路由动作的需求~在Ember的设计逻辑里,组件本身没法直接调用路由的动作,得通过动作向上传递的方式来实现:把路由的动作通过父模板传给组件,再让组件触发它。具体步骤如下:

1. 先在路由里定义删除动作

打开对应的路由文件(比如app/routes/holiday-hours.js),写下处理删除逻辑的动作:

import Route from '@ember/routing/route';

export default class HolidayHoursRoute extends Route {
  actions = {
    deleteHolidayHour(holidayHour) {
      // 这里写你的删除逻辑,比如调用后端API或者直接删除记录
      holidayHour.destroyRecord().then(() => {
        // 删除成功后的操作,比如刷新数据
        this.refresh();
      }).catch((error) => {
        // 处理删除失败的情况
        console.error('删除失败:', error);
      });
    }
  };
}
2. 在父模板把路由动作传递给组件

回到你的holiday-hours.hbs模板,给holiday-hour组件添加一个动作参数,把路由的deleteHolidayHour动作绑定进去,同时带上当前的holidayHour作为参数:

// templates/holiday-hours.hbs
{{#each model as |holidayHour|}}
  {{holiday-hour 
    holiday=holidayHour 
    shouldDisplayDeleteIcon=true
    onDelete=(action 'deleteHolidayHour' holidayHour)
  }}
{{/each}}

这里的onDelete是我们给组件约定的动作参数名,你也可以换成deleteAction这类更直观的名字,只要前后保持一致就行。

3. 在组件模板里触发传入的动作

打开holiday-hour组件的模板,给删除按钮绑定这个传入的onDelete动作:

// templates/components/holiday-hour.hbs
<!-- 先展示你的条目内容,比如日期、名称等 -->
<div class="holiday-hour-item">
  {{holiday.date}} - {{holiday.name}}
</div>

{{#if shouldDisplayDeleteIcon}}
  <!-- 点击按钮就触发传入的onDelete动作 -->
  <button class="delete-btn" {{action onDelete}}>删除</button>
{{/if}}

如果你的组件有对应的JS文件(app/components/holiday-hour.js),也可以显式声明这个动作参数,让代码更清晰易维护:

import Component from '@ember/component';

export default class HolidayHourComponent extends Component {
  // 声明接收onDelete动作参数
  onDelete = null;
}
额外小提示

如果是用Ember Octane及以上版本的Glimmer组件,语法会稍微调整:父模板里用@onDelete={{action 'deleteHolidayHour' holidayHour}}传递动作,组件模板里用{{@onDelete}}调用,核心逻辑还是一样的——动作从路由通过模板向下传递,组件触发后回调路由的处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:47:36