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

时间:2014-08-11 06:06:38

标签: ember.js

我有一个示例路线:

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

我可以在我的路线中访问此内容:

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

如何访问控制器中的:id

4 个答案:

答案 0 :(得分:8)

这是我在我的应用程序中执行此操作的方式。不确定这是否是最佳方法。

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

答案 1 :(得分:1)

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

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'});

答案 2 :(得分:1)

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

this.get('模型&#39)。ID

答案 3 :(得分:0)

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

因此,在您的情况下,我会执行以下操作:

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

然后在控制器或模板中,我可以通过调用

来访问客户端
model.client

并通过调用

获取id
model.id

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