2015-02-13 20 views
5

Per semplificare, sto cercando un modo per visualizzare un Behaviour (UI Element).Elementi dinamici basati sul comportamento in threepenny-gui

Il mio caso di utilizzo effettivo sta visualizzando una tabella che può essere filtrata. Quindi ho una funzione tableElement :: String -> UI Element (il parametro String è la condizione del filtro) e un campo di immissione filterElement :: Element, che rappresenta il filtro. Il modo più naturale per me di combinare questi sarebbe qualcosa di simile a questo:

bFilter <- stepper "" (valueChange filterElement) 
displaySomehow (fmap tableElement bFilter) 

Questo è anche il modo in cui si è fatto in Elm.

La cosa più vicina che ho trovato finora è l'utilizzo di sink children, ma funziona solo con [Element] e non con [UI Element]. Inoltre devo usare un elemento fittizio come genitore o violino in giro con i bambini rimanenti.

Quale sarebbe il modo migliore per implementare qualcosa di simile con threepenny-gui?

risposta

2

(Autore qui)

noti che UI Element rappresenta un azione che, una volta eseguito, può creare una nuova Element. Dovrai eseguire l'azione per eseguire quest'ultima. Sfortunatamente, non esiste attualmente alcun modo per farlo completamente nello stile FRP, dovrai ricorrere al combinatore onChanges per creare nuovamente la tabella ogni volta che il filtro cambia. Qui puoi utilizzare set children.

Esempio:

onChanges bFilter $ \s -> do 
    el <- tableElement s 
    myTable # sink children [el] 

I Bartab.hs e CRUD.hs esempi possono essere rilevanti per la vostra situazione.

+1

Bene, questo è sfortunato. Ho la sensazione che questo sia in qualche modo contro lo spirito di FRP. D'altro canto, threepenny-gui non è una libreria FRP pura in primo luogo, immagino. Vedi qualche possibilità di rendere gli elementi dinamici basati sui comportamenti possibili in futuro? – ipsec

+1

Sì, e sì. Il piano è di integrare a un certo punto tre penny con banana reattiva, e quindi supportare * lo scambio dinamico di eventi *, che è il concetto pertinente necessario qui. –

+0

Sembra fantastico, non vedo l'ora. – ipsec

0

È possibile utilizzare currentValue per ottenere il UI Element da lì si (si spera) in UI e si può ottenere l'elemento da includere nell'HTML.