2016-02-06 9 views
5

Chciałbym wysłać dwie wiadomości do różnych adresów na jednym wydarzeniu. Szczególny przypadek natknąłem było to, że miałem jakieś okienko, a gdy użytkownik kliknie przycisk „Dodaj” Chciałbym:Czy jest możliwe wysyłanie wielu wiadomości na jednym wydarzeniu za pomocą elm-html?

  • Zamknij okienko (wyślij wiadomość popup składnik)
  • Poinformuj element nadrzędny, który element powinien być dodano (wiadomość wysłana do komponentu nadrzędnego)

onClick ma następujący typ "Adres a -> a -> Atrybut" niektóre wydaje się niemożliwe do zrobienia. Z drugiej strony wydaje się, że taki wzór (jedno działanie skutkujące wielokrotnym przekazem) byłby często spotykany w praktyce.

Na razie uciekłem się do wysłania wiadomości informującej rodzica o pozycji dodanej, a następnie nadrzędnej w oknie aktualizacji funkcji aktualizacji o Ukryj akcję.

addButton = button [onClick context.addTaskAddress model.taskDescription] [text "Add"] 

a następnie w funkcji aktualizacji komponent rodzica

popup = AddTaskPopup.update AddTaskPopup.Hide model.popup 

Odpowiedz

3

Można skonfigurować pośrednią skrzynkę proxy, który pobiera listę adresów i komunikatów parach, a następnie zadzwonić, że od kliknięcia przycisku.

proxy : Mailbox (List (Address a, a)) 
proxy = 
    mailbox [] 

Wtedy można mieć sygnał rozgłaszania który nasłuchuje do skrzynki proxy i tworzy kilka zadań Signal.send powiadomić inne adresy.

port broadcast : Signal (Task x (List())) 
port broadcast = 
    let 
    tasks = List.map (uncurry Signal.send) 
    in 
    Signal.map (Task.sequence << tasks) proxy.signal 

Kod onClick będzie wtedy wyglądać tak, gdzie można przejść się na liście adresów i działania w parach:

onClick proxy.address [(address, Action1), (address, Action2)] 

Zauważ, że w powyższym kodzie address odnosi się do adresu wejścia w funkcja widoku, podczas gdy proxy.address odnosi się do właśnie skonfigurowanej skrzynki pocztowej.

Jest to rozwiązanie ogólnego przeznaczenia, które działa dla dowolnej liczby sygnałów.

Powiązane problemy