18

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

2 に答える 2

11

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これにより、ルートからを削除できるようになります。

于 2013-03-19T22:59:32.067 に答える
2

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')
    }
});
于 2018-05-17T15:01:08.217 に答える