2016-02-06 4 views
5

Vorrei inviare due messaggi a indirizzi distinti su un evento. Caso particolare ho incontrato era che avevo un po 'pop-up e quando l'utente fa clic su "Aggiungi" Vorrei:E 'possibile inviare più messaggi su un evento usando elm-html?

  • chiudere il popup (messaggio Invia a popup componente)
  • Inform componente padre tale elemento dovrebbe essere aggiunto (messaggio di invio al componente principale)

onClick ha il seguente tipo "Indirizzo a -> a -> Attributo" alcuni non sembrano esserci possibilità di farlo. D'altra parte, sembra che un tale schema (un'azione che porta a più messaggi) venga spesso incontrato nella pratica.

Per ora ho fatto ricorso a un messaggio che informa il genitore circa l'elemento aggiunto e poi il genitore nella finestra di aggiornamento degli aggiornamenti delle funzioni con Nascondi azione.

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

e poi in funzione di aggiornamento dei componenti del genitore

popup = AddTaskPopup.update AddTaskPopup.Hide model.popup 

risposta

3

È possibile impostare una casella di posta proxy intermedio che prende una lista di indirizzi e messaggi coppie, quindi chiamare che dal clic del pulsante.

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

Poi si potrebbe avere un segnale di trasmissione, che ascolta la cassetta postale proxy e crea un gruppo di Signal.send compiti di notificare altri indirizzi.

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

Il codice onClick sarebbe poi simile a questa, in cui si passa nella lista di indirizzo e di azione coppie:

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

Si noti che nel codice sopra riportato, address si riferisce all'indirizzo che entrano in la funzione di visualizzazione, mentre proxy.address si riferisce alla casella di posta proxy appena creata.

Questa è una soluzione generica che funzionerà per qualsiasi numero di segnali.