2017-02-06 10 views
0

私はデータダウン/アクションアップのコンセプトを知っていますが、私はDDAUでそれをやる方法がわからない状況に直面しています。私はdifferentsフォーラムやブログでそれを行う方法を検索しましたが、それは私の要求に合っていません。EMBERJS:子コンポーネントでアクションをトリガーするにはどうすればよいですか?

私はコントローラが2つあります。 最初のコンポーネントには、ボタン付きヘッダーがあります。 2番目のコンポーネントにはフォームがあります。

ボタンがクリックされると、アクションがトリガーされてコントローラによってキャッチされますが、最初のコンポーネントのボタンの「クリック」の2番目のコンポーネントにどのように通知できますか?

簡単な解決策は、最初のコンポーネントを2番目のコンポーネントに含めることでしたが、各コンポーネントがさまざまな状況で使用されるため、これを行うことはできません。

+0

※この操作をしないでください!これはちょうどDDAUパターンに対するものです。なぜ第2のコンポーネントはそのアクションについて知る必要があるのでしょうか?そのコードをコントローラに書き込んでください。私はここに[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)があると思います。 – Lux

+0

コンポーネントが何をしなければならないのかを実行できない場合にコンポーネントを使用し、DDAUに準拠するためにコントローラ内でこの動作の部分を移動させないのはなぜですか?私のコンポーネント**は、アクションが変更を引き起こさなければならないので、アクションについて知るために**必要となります(例えば、外部のajaxクエリ、保存などからのリフレッシュ)。これは私のコンポーネントの完全な責任であり、コントロールに委任すべきではありません。また、私は、このコンポーネントを使用して各コントローラーにコントロールコードを複製したくありません。 – luke77

+0

あなたの最初の例であるAJAXリクエストは、おそらくコンポーネント内で行うべきではないものです。通常、このフォームコンポーネントとバートンコンポーネントを並べて使用する場合は、他の2つを含む第3のコンポーネントを作成することをお勧めします。あなたのコードは、この周囲のコンポーネントに座ることができます。おそらくあなたはこれをさらに議論するために余裕のないチャンネルに参加することができます。 – Lux

答えて

0

fooプロパティをコントローラーから両方のコンポーネントに渡すことができます。最初のコンポーネントは、コントローラーにアクションを渡してfooを渡します。今度はこの兄弟コンポーネントも通知され、変更に反応するために兄弟コンポーネントにdidUpdateAttrsフックを使用することができます。

+0

イベントについて通知するためにデータ変更を使用してこれについて説明していますが、これを行うことはできません。もっと良い方法があると思います... – luke77

+0

可能であれば、この種のアプローチから。あなたがあなたの質問のユースケースを説明することができれば、より良い解決策が得られるかもしれません。 – kumkanillam

1

サービスはバスとして使用できます。

2番目のコンポーネントにイベントを登録し、最初のコンポーネントからそのイベントをトリガーします。

あなたは親子モデルを使用することができるサービスを使用したくない場合は、私はthis twiddle

でそれを示しています。

ご覧ください。that twiddle

+0

はい、実際、私はこれを使うことができました。私は2つの兄弟構成要素に通知するバスよりももっとシンプルなものを期待していました。 – luke77

+0

@ luke77私の回答を更新しました –

+0

あなたの更新のためにありがとう、私はそれを見ます。 – luke77

関連する問題