如何在页面加载时过滤信号

时间:2016-01-07 16:29:28

标签: elm

为了学习,我只是在点击按钮时尝试加载内容。到目前为止,我已成功:

  • 点击按钮时重新加载内容。
  • 点击时过滤信号(如果我发送的字符串不是“GETPERF”)

但我的问题是,一旦页面加载,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调用? (还是一些更惯用的方式来做这一切?)

1 个答案:

答案 0 :(得分:2)

您获得初始ajax请求的原因是Signal.filter仍保留"boo"的初始值(请参阅Signal.filter documentation here)。通过使用下划线参数,在下一个Signal.map语句中忽略该值,但仍然会返回Http任务,这就是您在页面加载时看到初始ajax请求的原因。

Signal.filtersig时,您可以编写仅在正确情况下发送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