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

Ember.js技术问题:如何在控制器中获取URL传递的路由参数

嘿,这个问题我太熟悉了!在Ember.js开发里,控制器要获取URL里的路由参数,其实有几种实用的方式,尤其是你提到的edit路由拿:id的场景,我给你拆解清楚:

方法一:通过路由的model钩子传递参数

这是最常用的方式,毕竟大多数时候你拿到:id参数后,都会用它去请求对应的数据。路由的model钩子会自动接收URL里的动态参数,你可以把参数(或者包含参数的模型数据)返回,控制器就能直接访问。

举个edit路由的例子:

// app/routes/edit.js
import Route from '@ember/routing/route';

export default class EditRoute extends Route {
  model(params) {
    // params对象里就包含了URL中的:id参数
    // 这里可以结合你的业务逻辑,比如用id请求后端数据
    return this.store.findRecord('post', params.id);
    // 如果只是单纯要传递id,也可以返回{ id: params.id }
  }
}

对应的控制器里,你可以直接通过this.model(非Octane版本)或者@model(Octane及以上)访问参数:

// app/controllers/edit.js
import Controller from '@ember/controller';

export default class EditController extends Controller {
  // 定义一个计算属性方便使用
  get currentPostId() {
    // 如果你返回的是模型记录,直接取id属性
    return this.model.id;
    // 如果返回的是自定义对象,就用this.model.id
  }
}
方法二:直接获取路由参数对象

如果你不需要通过model钩子传递数据,只是单纯想拿到URL里的参数,用paramsFor方法或者路由服务会更直接。

方式A:使用paramsFor方法

这个方法可以直接获取指定路由的参数,在控制器里这么写:

// app/controllers/edit.js
import Controller from '@ember/controller';

export default class EditController extends Controller {
  get currentId() {
    // 传入路由名称,就能拿到对应的参数对象
    return this.paramsFor('edit').id;
  }
}

方式B:通过路由服务访问

注入路由服务后,可以获取当前激活路由的参数:

// app/controllers/edit.js
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';

export default class EditController extends Controller {
  @service router;

  get currentId() {
    // 从当前路由的参数中提取id
    return this.router.currentRoute.params.id;
  }
}
小提示
  • 如果你用的是Ember Octane(3.16+)的模板语法,在模板里也能直接用@model.id或者{{this.paramsFor('edit').id}}访问参数,但你问的是控制器,所以重点放在了控制器的实现上。
  • 优先用model钩子传递参数,因为它能和你的数据请求逻辑结合得更紧密;如果只是临时拿参数,paramsFor会更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:34:52