6

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

企業に関するデータを表示するアプリケーションがあります。ここに私が欲しいルートがあります:

 /                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}}

しかし、要約ルートは私が立ち往生している場所です。私が思いついた2つのオプション:

  1. CompaniesController必要な追加のメソッドを使用して を作成し、それIndexControllerを拡張してを作成します

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

    次に、私が知る限り、両方のルートでモデルを見つける必要があります。

    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. リソースsummary内でルートをネストし、 「/」のパスを指定します。companiesこれについて私が気に入らないのは、UI の「入れ子」がデータと一致しないことです。modelまた、ルートごとにプロパティを再定義する必要があるようです。

より良い別のオプションはありますか?

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

4

1 に答える 1

3

コントローラ間でデータを共有するには、needsAPIを使用するのが正しい方法です。

CompaniesController他のコントローラーで利用できるようにしたいすべてのデータがあると仮定すると、を介して定義する必要があります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');
  }
});

それが役に立てば幸い。

于 2013-07-19T14:36:36.540 に答える