2013-07-19 10 views
6

コントローラ/ルート間でデータを共有する方法を理解しようとしています。emberでのデータ共有

私は会社に関するデータを表示しているアプリケーションを持っています。

/    summary info 
/companies  list of all companies with some more detail 
/companies/:id details about a single company 

ここで、3つのルートすべてに必要なデータは、会社データの1つの配列に含まれています。だから、アプリ起動時にそのデータをロードして、各ルートで使用する必要があります。コントローラ上で共有する必要がある追加の方法もあります。

第2及び第3のルートがネストされていることは明らかであるので、私はその会社のデータを渡すことによって、特定の会社にリンクするとき、私はCompaniesControllerからのデータを共有することができます

{{#linkTo 'company' company}}{{ company.name }}{{/linkTo}} 

しかし、要約ルートは私が立ち往生しているところです。私が作ってみた二つのオプション:

  1. 私は必要なすべてのメソッドを持つCompaniesControllerを作成し、私の知る限り、次に

    App.IndexController = App.CompaniesController.extend({}); 
    

    それを拡張することによりIndexControllerを作成し、両方のルートはモデルを見つける必要があります:

    App.Router.map(function() { 
        this.resource('companies'); 
    }); 
    
    App.CompaniesRoute = Ember.Route.extend({ 
        model: function() { 
         return App.Company.find(); 
        } 
    }); 
    
    App.IndexRoute = Ember.Route.extend({ 
        model: function() { 
         return App.Company.find(); 
        } 
    }); 
    

    はそうもっと良い方法があるはずのように、私は私が追加するたびに新しいルートのためにこれを繰り返す必要がありますので、(例えば/revenue)。

  2. companiesリソース内のsummaryルートをネストし、 '/'のパスを指定します。私が気に入らないのは、UIの「ネスト」がデータと一致しないということです。また、私は各ルートのmodelプロパティを再定義する必要があるようです。

別のオプションがありますか?

tl; dr:コントローラ間でデータを共有するにはどうすればよいですか?

答えて

3

データコントローラとデータを共有するには、正しい方法はneeds APIを使用することです。あなたのCompaniesControllerを想定し

はあなたがあなたが1、より多くを定義する場合、これは単純な文字列、または文字列の配列にすることができ、needs経由で定義する必要があり、他のコントローラに利用できるようにしたいすべてのデータを持っています。

App.MyController = Ember.ObjectController.extend({ 
    needs: ['companies'], 
    myFunction: function() { 
    // now you can access your companies controller like this 
    this.get('controllers.companies'); 
    } 
}); 

アクセス物事をより容易にするために、あなたは、さらに、たとえば、結合を定義することができます。

App.MyController = Ember.ObjectController.extend({ 
    needs: ['companies'], 
    companiesBinding: 'controllers.companies', 
    myFunction: function() { 
    // now you can access your companies controller like this 
    this.get('companies'); 
    } 
}); 

はそれがお役に立てば幸いです。

+0

ありがとうございました。バックボーンから来て、私はこの周りに私の頭を包んで苦労している。コントローラはデータの共有にしか使用できないようです。バックボーンでは、複数のビューにアクセスできる「企業」コレクションがあります。簡単に言えば、モデラーの共有配列を格納する目的のためだけにコントローラを作成するのが適切ですか? –

+0

「アプリケーション設定」のようなデータがある場合は、ルート/コントローラ/ビューのコンボに含まれていないSettingsControllerを持つよりもうまくいきます。次に、needs APIを使用して、他のコントローラーが設定を使用できるようにすることができます。しかし、あなたのデータがあなたが定義したリソースツリーに関連している場合、各リソースの特定のコントローラーがより良いアプローチであり、あなたは引き続きすべてのタイプのコントローラーを共有することができます。 – intuitivepixel

+0

ここでお尻をつけて申し訳ありませんが、私は何かを明確にしたいと思います。 @intuitivepixelこれは逆の方向に働きますか?インデックスルート 'ニーズ'会社?これはコンテナのルックアップを行う必要があるのでしょうか、ルートフックもまた起動しますか? –

関連する問題