关于Init的Elm Http请求

mmm*_*ceo 10 elm

我对榆树很新,但慢慢熟悉它.我正在做一些简单的Http请求,它在各个方面都很成功(我得到要显示的数据等)

目前我只能让我的fetchData触发onClick,我想在init上初始化它,但是我无法绕过这个问题.

....这是我的fetchData函数:

fetchData : Cmd Msg
fetchData =
  Http.get repoInfoListDecoder "http://example/api"
    |> Task.mapError toString
    |> Task.perform ErrorOccurred DataFetched
Run Code Online (Sandbox Code Playgroud)

当前由onClick事件在视图中触发:

.....
, button [ onClick FetchData ] [ text "Load Data" ]
.....
Run Code Online (Sandbox Code Playgroud)

我想避免通过按钮请求数据,而是希望在初始化应用程序时加载数据.这是我的初始:

init =
  let
    model =
      { message = "Welcome", repos = [] }
  in
    model ! []
Run Code Online (Sandbox Code Playgroud)

还有我的更新(有点剥离...例如sakes):

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    NoOp ->
      model ! []
    ...........
    FetchData ->
      { model | message="hi" } ! [fetchData]
    ...........
    DataFetched repos ->
      { model | repos = repos, message = "The data has been fetched!" } ! []
Run Code Online (Sandbox Code Playgroud)

这有道理吗?我只是在应用程序加载时初始化fetchData时遇到困难,所以我可以显示我的数据而无需点击按钮来获取它.

提前致谢!

hal*_*bra 15

当您使用Html.program时,您的init函数将返回要执行的Model和Command的初始数据.

命令是副作用,如HTTP请求.

尝试更改,init以便立即运行命令:

init: (Model, Cmd Msg)
init =
  let
    model =
      { message = "Welcome", repos = [] }
  in
    model ! [ fetchData ]
Run Code Online (Sandbox Code Playgroud)