为了学习,我只是在点击按钮时尝试加载内容。到目前为止,我已成功:
但我的问题是,一旦页面加载,Ajax调用仍然会被触发。
以下是代码:
-- 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
有没有办法阻止页面加载时的第一个Ajax调用? (还是一些更惯用的方式来做这一切?)
答案 0 :(得分:2)
您获得初始ajax请求的原因是Signal.filter
仍保留"boo"
的初始值(请参阅Signal.filter
documentation here)。通过使用下划线参数,在下一个Signal.map
语句中忽略该值,但仍然会返回Http任务,这就是您在页面加载时看到初始ajax请求的原因。
当Signal.filter
为sig
时,您可以编写仅在正确情况下发送ajax请求的条件,而不是使用"GETPERF"
。如果sig
不 "GETPERF"
(如在页面加载中),您实际上可以通过返回Task.succeed ()
来执行任何操作。以下是具有这些更改的重构fetchReadme
函数:
port fetchReadme : Signal (Task Http.Error ())
port fetchReadme =
let
fetchAndReport sig =
if sig == "GETPERF" then
Http.getString "http://localhost:3000/dates"
`andThen` report
else
Task.succeed ()
in
Signal.map fetchAndReport inbox.signal