2013-03-19 13 views
16

Ember.Route.modelparams変数へのアクセスを持っていますが、Ember.Route.setupControllerません。私のパスには複数のダイナミックセグメントがあり、テンプレート内のすべてを使用する必要があるため、これは私にとって面倒です。 /project/:project_id/task/:task_idEmber.Route内からパラメータにアクセスする適切な方法は何ですか。 setupController?

具体的には、私のパスは次のようになります。タスクは、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' }); 
}); 

答えて

10

setupControllerフック内のこれらのパラメータにはアクセスできません。 モデルフックは、アプリケーションがURLを介して入力されたときに呼び出されただけなので、paramsオブジェクトにアクセスできます。

あなたのコードは非常に正常に見える、それはあなたが本当にあなたはそれをこのようにやりたいことを、知っています。それについてあなたにハッキリと感じることは何ですか?このコードを見ると、RouteのロジックをProjectRouteと従属TaskRouteに分割しなかった理由を自分自身に尋ねています。それはあなたのために働かないだろうか?

更新:変更

ネストリソースへの対応は、おそらくあなたのケースで成功への鍵です:TaskRouteがネストされているので、あなたがProjectTaskRouteに名前を変更する必要はありませ

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

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

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

+0

ああ、私は、モデル法は、最初のロード時に呼び出されることを認識していませんでしたが、それは私が見てきたquirkinessの多くを説明しています。たとえば、 'model'が呼び出されていないので、/ project/1/tasks/2を直接開くと、上のコードは機能しません。したがって、' parentProjectId'属性は設定されません。その場合は、 'setupController'の中で' var parentProject = this.modelFor( 'project') 'を実行する必要があります。 私は別のProjectRouteを持っています。/project/1を開くと、プロジェクトのタスクが表示されます。タスクをクリックすると、/ project/1/tasks/1が開きます。タスクビューにはプロジェクトに戻るリンクが必要なので、URLからプロジェクトを取得しています。 – NudeCanalTroll

+0

それでは今は動作しますか?私の考えはthis.modelFor( "project")も使用することでした。/project/1/tasks/2経由でアプリケーションを入力するときは、まずProjectRouteをヒットし、モデルフックを押す必要があります。その後、modelForを使用してアクセスできます。 ember-dataを使用してデータをモデル化するときに、コントローラのparentProjectを設定するのはちょっと冗長な感じです。 TaskModelにそのプロパティが存在してはいけませんか? – mavilein

+0

タスクは複数のプロジェクトに属することができます(タグのようなプロジェクトを考える)、「プロジェクトに所属しています」という関連付けをするのではなく、「多くのプロジェクトを持っています」という関連付けです。したがって、タスクを見るだけで、私が入っているプロジェクト(つまり、戻るボタンをリンクする場所)を知ることができません。私はURLを確認する必要があります。とにかく、私はモデルを試してみよう。私は自分のルートが正しく設定されていないと思うので、/ project/1/task/2に行くと、まずTaskRouteがヒットします。プロジェクトルート内に自分のタスクルートを入れ子にする必要があると思いますか?自分のルートがどのように見えるかを表示するために質問を更新します。 – NudeCanalTroll

関連する問題