4

Ember の新しいバージョン (ルーター V2) の 1 つを使用していますが、さらに新しいルーター V2.2 のブリーディング エッジではありません (最終コミット: 668783a (2013-01-06 21:10:55 -0800))。

私たちのソリューションには、いくつかのビュー コンポーネント (グリッド、オートコンプリート、検索ビューなど) があります。これらのコンポーネントの一部は、ストアやモデルなどにアクセスするため、その作業を処理するコントローラーがあります。これらのビューは、ソリューション全体のいくつかのテンプレートで使用されています。

古いバージョン (pre2) では、これらのビュー コンポーネントを次のように使用しました。

App.ConsoleView = Ember.View.extend({
    templateName: 'console',
    searchView: App.SearchView.extend(),
    .....
})

コンソール テンプレートでは、このような共通ビューを使用しました

{{view view.searchView controllerBinding='App.searchController'}}

私はいつも、このアプローチは最善の方法ではないと感じていました.Emberの新しいバージョンでは、私たちの指を叩きました:)

ここで、「コントローラーを必要とするテンプレートで共有ビューを使用するための推奨される方法は何ですか?」という質問に移ります。

Ember の新しいバージョンでは、テンプレート式

{{view view.searchView controllerBinding='App.searchController'}}

App.searchController が App 名前空間でインスタンス化されなくなったため、機能しません。

私はいくつかの選択肢を考えましたが、本当に好きではありません。

  1. ルーターを介してコントローラーを「親コントローラー」に接続することもできますが、共有コンポーネントを使用するすべてのルートでこれを行う必要があり、それは大変なことになります。
  2. いくつかのハッキーな方法でコントローラーを取得し、ビューの init 関数の init 関数を介して設定することができました。

これを良い方法で行うための推奨事項はありますか? これに関するドキュメントが見つからず、googlejuize が不足しています。

すべての応答が高く評価されます!

4

1 に答える 1

2

{{render "search"}}を使用しようとすると、searchControllerが検索され、SearchViewがインスタンス化されて接続されます。

それ以外の場合は、ビューヘルパーでコントローラークラスを渡すことができるようにするための議論が現在行われていることを私は知っています。しかし、まだ実装されていません。

更新:今のところ、 https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/ext/controller.js#L33を使用して、提案する2番目のソリューションを使用します。

App.ParentView = Ember.View.extend({
  searchView = Ember.View.extend({
    init: function(){
      this._super();
      this.set('controller', this.get('parentView.controller').controllerFor('search'))
    }
  })
})

ここでは、すべての検索ビューが同じコントローラー(およびその基になるアプリケーションの状態)を共有すると想定しています。

于 2013-01-16T08:53:22.557 に答える