问题 如何在Ember.js中访问控制器中的动态段?


我有一个示例路线:

this.route('client', {path: ':id'});

我可以在我的路线中访问这个:

model: function(params) {
    console.log(params.id);
}

我如何访问 :id 在我的控制器?


857
2017-08-11 06:06


起源



答案:


这就是我在我的应用程序中这样做的方式。不确定这是否是最佳方法。

App.IndexRoute = Em.Route.extend({
  model: function(params) {
    this.set('params', params);
  },
  setupController: function(controller, model) {
    controller.set('params', this.get('params'));
    this._super(controller, model);
  }
});

或者,您也可以在控制器内的容器上进行查找。但我真的不认为这是一个好方法。这是一个例子。

this.get('container').lookup('router:main').router.currentHandlerInfos
        .findBy('name','index').params

8
2017-08-11 06:29



我还建议跳过setupController部分,然后从model()钩子返回Hash。 - XLII
@XLII在我的用例中,我还需要返回一个实际的模型。所以我使用了params的setupController方法。 - blessenm
YMMV,但如果这是唯一的setupController角色,你可以做一些事情 function(c,p) { return {obj: ..., params: p}; },但这是需求和个人偏好的问题。 - XLII


答案:


这就是我在我的应用程序中这样做的方式。不确定这是否是最佳方法。

App.IndexRoute = Em.Route.extend({
  model: function(params) {
    this.set('params', params);
  },
  setupController: function(controller, model) {
    controller.set('params', this.get('params'));
    this._super(controller, model);
  }
});

或者,您也可以在控制器内的容器上进行查找。但我真的不认为这是一个好方法。这是一个例子。

this.get('container').lookup('router:main').router.currentHandlerInfos
        .findBy('name','index').params

8
2017-08-11 06:29



我还建议跳过setupController部分,然后从model()钩子返回Hash。 - XLII
@XLII在我的用例中,我还需要返回一个实际的模型。所以我使用了params的setupController方法。 - blessenm
YMMV,但如果这是唯一的setupController角色,你可以做一些事情 function(c,p) { return {obj: ..., params: p}; },但这是需求和个人偏好的问题。 - XLII


您可以利用路线中的序列化功能。这是 API文档 为了它。但是,在您的上下文中,您可以这样做:

App.IndexRoute = Em.Route.extend({
  model: function(params) {
    console.log(params.client_id);
  },
  serialize: function(model){
    return { client_id : model.id };
  }
});

让我知道这个是否奏效!

我还注意到你的路线定义中有错误。它可能应该是

this.route('client', {path: '/:client_id'});

要么

this.route('client', {path: '/client/:client_id'});

1
2017-08-11 15:33



这回答了这个问题吗? - Joshua Plicque


如果您的id恰好是模型的一部分,您可以从模型本身检索。 例如,如果您有一个路径,其中对象Bill作为模型,并且路径bill /:billId,您可以通过以下方式检索它:

this.get( '模式')。ID


1
2017-07-07 20:04





我刚刚遇到这个问题,因为我也想知道最好的方法是什么。我选择通过从模型返回哈希的路线,而不是在路线中设置参数。

所以在你的情况下,我会做以下事情:

model() {
  Ember.RSVP.hash({client: <get client>, id: id});
}

然后在控制器或模板中,我可以通过调用访问客户端

model.client

并通过调用获取id

model.id

我个人认为,与在路线上设置参数相比,这是一种更简洁的方式来访问id。当然我假设id尚未在模型上设置。否则这整个练习毫无意义。


0
2018-04-14 16:53