2017-02-06 12 views
0

Я знаю концепцию Data Down/Actions Up, но я столкнулся с ситуацией, когда я не знаю, как это сделать с DDAU. Я искал на разных форумах и блогах, как это сделать, но это не соответствует моему запросу.EMBERJS: Как вызвать действие в дочернем компоненте?

У меня есть контроллер с двумя компонентами. На первом компоненте у меня есть заголовок с кнопкой. На втором компоненте у меня есть форма.

Когда кнопка нажата, действие запускается триггером и улавливается контроллером, но как я могу уведомить второй компонент «щелчок» на кнопке на первом компоненте.

Простым решением было бы включить первый компонент во второй, но я не могу этого сделать, потому что каждый компонент используется во многих разных ситуациях.

+0

* Вы не делаете это *! Это просто против шаблона DDAU. Почему второй компонент даже должен знать об этом действии? Напишите этот код в контроллере. Я думаю, что у нас есть [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Lux

+0

Почему бы не использовать компоненты, если он не может выполнить то, что должен выполнить компонент, и переместить эту часть поведения внутри контроллера только для того, чтобы быть совместимым с DDAU. Мои компоненты ** нуждаются в **, чтобы узнать о действии, потому что действие должно инициировать изменения (например, обновление от внешнего запроса ajax, сохранения, ...). Это полностью отвечает моей компоненте и не следует делегировать ее. Кроме того, я не хочу дублировать код контроллера на каждом контроллере, используя этот компонент. – luke77

+0

Ваш первый пример - запрос AJAX - это то, чего вы, вероятно, не должны делать в компоненте. Если вы обычно используете этот компонент формы и компонент burton бок о бок, вероятно, лучше всего создать третий компонент, содержащий два других. Что ваш код может сидеть в этом окружающем компоненте. Может быть, вы могли бы присоединиться к слабину, чтобы обсудить это дальше. – Lux

ответ

0

Вы можете передать foo свойство от контроллера к обоим компонентам, а первый компонент передать действие контроллеру для изменения foo. Теперь этот побочный компонент также будет уведомлен, и вы можете использовать крючок didUpdateAttrs в компоненте для родного брата, чтобы реагировать на изменение.

+0

Я об этом, используя изменение данных, чтобы уведомлять о событии, но я просто не могу решить это сделать, я полагаю, что есть лучший способ сделать это ... – luke77

+0

Как сказал Люкс, если возможно, лучше держаться подальше от такого подхода. ИМХО. Возможно, если бы вы могли объяснить случаи использования в вашем вопросе, могут быть лучшие решения, которые вы получите. – kumkanillam

1

Вы можете использовать услуги в качестве автобуса.

Зарегистрировать событие во втором компоненте и вызвать это событие из первого компонента.

Я показываю его в this twiddle

Если вы не хотите пользоваться услугами вы можете использовать родитель-потомок модели.

Пожалуйста, обратите внимание на that twiddle

+0

Да, действительно, я мог бы использовать это. Я надеялся, что вы попробуете больше «простого», чем автобус, чтобы уведомить двух родственных компонентов. – luke77

+0

@ luke77 Я обновил свой ответ –

+0

спасибо за ваше обновление, я посмотрю на него. – luke77