2015-08-12 3 views
2

Я немного застреваю, ища подходящий способ сделать следующее. У меня есть родительский компонент с двумя дочерними компонентами (см. Упрощенный код ниже). Я хотел бы знать правильный способ для ChildA, когда его кнопка нажата, чтобы «invoke» ChildB. Они должны общаться через родителя, но должны ли они общаться через своих контроллеров? В этом случае родитель должен передать свой контроллер контроллерам детей.Mithril.js: Должны ли два дочерних компонента разговаривать друг с другом через контроллер своего родителя?

Parent = { 
    view: function() { 
    m.component(ChildA); 
    m.component(ChildB); 
    } 
} 

ChildA = { 
    view: function() { 
    m('button') 
    } 
} 

ChildB = { 
    view: function() { 
    } 
} 

ответ

5

Это действительно просто вопрос простой JavaScript стиль, который вы предпочитаете. Подумайте о связи между объектами JS и о том, как вы справитесь с этим.

Вообще, мифриловые дэвы выбор между Parent/Child связи и Pub/Sub. Для родителей/детей контроллер обычно используется разработчиками. m.component принимает несколько параметров, в которых вы можете передавать ссылки (данные/состояние/логика) на дочерние компоненты. See the docs. Нет необходимости передавать родительские контроллеры детям.

Тем не менее, я предпочитаю создать модель , которая живет за пределами одного компонента. Здесь я сохраняю состояние представления (т. Е. Данные формы) и логику просмотра (т. Е. События, связанные с пользовательским интерфейсом обратные вызовы и общее состояние между компонентами). Таким образом, когда я неизбежно меняю/добавляю компоненты, мне не придется перерабатывать логику контроллера в каждом компоненте.

Leo Horie, автор Mithril, wrote an article, в котором он объясняет общение между родителем и одним ребенком, но это может быть легко применено к нескольким детям.

Паб/Суб - это общая идиома JS. Вики Мифрила перечисляет несколько вкладов сообщества, которые справляются с этим. Перейдите на страницу the wiki, откройте страницу «Все темы» и выполните обычную страницу поиска «pub». Там вы найдете несколько вариантов. В зависимости от сложности вашего приложения следующим шагом может быть поиск библиотеки Pub/Sub через Google.

+0

Спасибо, пеон! Отличная информация, это, безусловно, даст мне долгий путь в правильном направлении. –

1

Я думаю, когда вы нажимаете на кнопку ChildA, некоторые модели состояние будет обновляться? Затем, если оба дочерних объекта используют одну и ту же модель, перерисовка, выполненная Mithril после каждого события, автоматически обновит ChildB.

Мое предложение - передать модель дочерним объектам и позволить ChildA также быть контроллером кнопки. Почему не родитель? Родители обычно должны обрабатывать команды, которые применяются к нескольким дочерним представлениям (или самому себе), и щелчок кнопки кажется простым/связанным достаточно для ChildA, чтобы управлять этим. Но, конечно, это зависит от реальной сложности системы. Всегда проблема с простым примером, она не описывает реальность. :)

Вот пример того, как я имею в виду в любом случае: http://jsbin.com/sipahe/edit?js,output

(Извините за CoffeeScript, но это кратко и передает смысл очень хорошо.)

+0

Спасибо за пример. И здорово, что вы используете Coffeescript, так как я сам использую соответствующий LiveScript. :) –