web-dev-qa-db-ja.com

Ember.Route内からパラメーターにアクセスする適切な方法は何ですか。 setupController?

Ember.Route.modelparams変数にアクセスできますが、Ember.Route.setupController ではない。パスに複数の動的セグメントがあり、それらすべてをテンプレートで使用する必要があるため、これは私にとって厄介です。

具体的には、私のパスは次のようになります。/project/:project_id/task/:task_id。タスクは、1つだけでなく、多くのプロジェクトに属することができることに注意してください。したがって、タスク自体を見ているだけでは、どのプロジェクトを見ているのかわかりません。URLにあるプロジェクトIDを使用する必要があります。これが私が現在それをしている方法です:

App.TaskRoute = Ember.Route.extend({

  // This works just fine:
  serialize: function(model) {
    return {
      task_id: model.get('id'),
      project_id: this.modelFor('project').get('id')
    };
  },

  model: function(params) {
    this.set('parentProjectId', params.project_id);

    return App.Task.find(params.task_id);
  },

  setupController: function(controller, model) {
    var parentProject = this.modelFor('project') ?
                        this.modelFor('project') :
                        App.Project.find(this.get('parentProjectId'));
    controller.set('parentProject', parentProject);

    controller.set('content', model);
  }
});

多分私は妄想的です、これはただハッキーに感じます。ルートがパラメータにアクセスできるようになっている場合は、すでにparamsプロパティがアタッチされています。もっと良い方法はありますか?

編集:上記のコードを更新しました。また、私のルートは次のようになります。

App.Router.map(function() {
  this.resource('project', { path: '/project/:project_id' });
  this.resource('task', { path: 'project/:project_id/task/:task_id' });
});
17
NudeCanalTroll

SetupControllerフックでこれらのパラメーターにアクセスすることはできません。 モデルフックは、アプリがURL経由で入力されたときに呼び出されるため、paramsオブジェクトにアクセスできます。

あなたのコードは非常にうまく見えます、あなたが本当に知っている、あなたはそれをこのようにしたいのです。それについてあなたにとって何がハッキーだと感じますか?このコードを見ると、ルートのロジックをProjectRouteと従属TaskRouteに分割しなかった理由を自問しています。それはあなたのために働きませんか?

更新:変更への対応

あなたの場合、リソースをネストすることが成功の鍵となる可能性があります。

App.Router.map(function() {
  this.resource('project', { path: '/project/:project_id' }, function(){
    this.resource('task', { path: '/task/:task_id' });
  });
});

TaskRouteはネストされているため、名前をProjectTaskRouteに変更する必要はありません。

App.ProjectTaskRoute = Ember.Route.extend({
...
});

これにより、ルートからparentProjectId propertyを削除できるようになります。

11
mavilein

Ember 1.8なので、Routeクラスには paramsFor 関数があります。

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

export default Route.extend({
    setupController(controller) {
        this._super(...arguments);
        const params = this.paramsFor('name.of.your.route')
    }
});
1