以下は、私が EmberJS GitHub に投稿したイシューからのものですが、ディスカッションには GitHub よりも Stack Overflow の方が適しています。
現在、複合コンポーネントを含むいくつかの複雑なコンポーネントを構築していますが、極度に分離されたコンポーネントが存在する障害にぶつかっています。コンポーネントがコントローラーでアクションをトリガーする必要がない場合がいくつかありますが、コントローラーがコンポーネントの動作変更をトリガーする必要があります。問題は、コンポーネントがコントローラーを認識しておらず、コントローラーもコンポーネントを作成していないことです。コンポーネントはテンプレートで定義されています。
クラスをサブクラス化してEmber.Component
、メッセージがコンポーネントを通過する方法を提供することで、問題を解決しました。
新しいコンポーネント サブクラスは、外側のコントローラーを認識してはならないコンポーネントの意図的な分離を破ります。外部からコンポーネントメソッドを呼び出すために私が見つけた2つの侵襲性の低いオプションは次のとおりです。
- コンポーネントとインスタンスのペアの名前を のようにグローバル配列にキャッシュし
App.components
、コンポーネント メソッドを次のように呼び出します。App.components['name'].method()
- 外部からイベントをトリガーし、コンポーネントに登録して処理します。ただし、その場合、eventSourceオブジェクトをコンポーネントに渡します。多くの場合、コントローラーは次のようになります。
{{my-component eventSource=controller}}
私の質問は、コンポーネントに対して可能な限り最もエレガントで侵襲性の低い方法でこの問題を解決するにはどうすればよいかということです。レゴピースのようなコンポーネントを使用して複合コンポーネントを実現するために、コンポーネントの分離を壊さずにその目標を達成する方法を理解することは、現時点では不可能に思えます。
意見、アイデア、解決策、議論は大歓迎です。
注:ところで、コンポーネントの分離を破る最初の方法は、ember-bootstrap コンポーネントで行われた作業に触発されています: https://github.com/ember-addons/bootstrap-for-ember 著者は、外部からコンポーネント内のメソッドをトリガーできるという同じ問題。
別の注意:記録として、コンポーネントにアクセスするもう 1 つの方法Ember.View.views['name']
は、 name がコンポーネントに付けたビュー名である場所を使用することです。ただし、コントローラーからさらにそのような呼び出しを行うのは汚いと感じます。