elm - How to filter a Signal on page load -
for sake of learning, i'm trying load content when click on button. far i've managed :
- reload content when click button.
- and filter signal when click (if string send not "getperf")
but problem ajax call still triggered once page loads.
here's code:
-- signals & mailbox inbox : signal.mailbox string inbox = signal.mailbox "some text" result : signal.mailbox string result = signal.mailbox "" -- view view : string -> html view msg = div [] [ h1 [] [text "mailbox3"], p [] [text msg], button [onclick inbox.address "getperf"] [text "click perf"], ] main : signal html main = signal.map view result.signal -- task & effects port fetchreadme : signal (task http.error ()) port fetchreadme = inbox.signal |> signal.filter (\sig -> sig == "getperf" ) "boo" |> signal.map (\_ -> http.getstring "http://localhost:3000/dates" `andthen` report) report : string -> task x () report html = signal.send result.address html is there way prevent first ajax call on page load ? (or more idiomatic way of doing ?)
the reason you're getting initial ajax request signal.filter still keeping initial value of "boo" (see signal.filter documentation here). value ignored in next signal.map statement use of underscore parameter, http task still getting returned , that's why see initial ajax request on page load.
instead of using signal.filter, write conditional sends ajax request in correct circumstances, when sig "getperf". , if sig not "getperf" (as in page load), can, in essence, nothing returning task.succeed (). here refactored fetchreadme function these changes:
port fetchreadme : signal (task http.error ()) port fetchreadme = let fetchandreport sig = if sig == "getperf" http.getstring "http://localhost:3000/dates" `andthen` report else task.succeed () in signal.map fetchandreport inbox.signal
Comments
Post a Comment