2016-10-10 151 views
8

我对Elm很新,但是慢慢熟悉它。我正在做一些简单的Http请求,它在每个方面都很成功(我得到要显示的数据等)初始化Elm Http请求

目前我只能让我的fetchData触发onClick,我想初始化这个初始化,但我无法绕过这个包裹。

....这里是我的fetchData功能:

fetchData : Cmd Msg 
fetchData = 
    Http.get repoInfoListDecoder "http://example/api" 
    |> Task.mapError toString 
    |> Task.perform ErrorOccurred DataFetched 

这是目前在该视图由onClick事件触发:

..... 
, button [ onClick FetchData ] [ text "Load Data" ] 
..... 

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

init = 
    let 
    model = 
     { message = "Welcome", repos = [] } 
    in 
    model ! [] 

我的更新(一种剥离...例如的缘故):

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!" } ! [] 

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

提前致谢!

回答

9

当您使用Html.program,你init函数返回模型和命令的初始数据执行。

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

尝试改变init所以它运行一个命令马上:

init: (Model, Cmd Msg) 
init = 
    let 
    model = 
     { message = "Welcome", repos = [] } 
    in 
    model ! [ fetchData ] 
+0

谢谢!清楚的解释! – mmmaceo

+0

@mmmaceo高兴地帮助! – halfzebra

0

这里是型号签名Html.App.programinit接受Cmd,你只需在这里给你的Cmd。

program 
    : { init : (model, Cmd msg), update : msg -> model -> (model, Cmd msg), subscriptions : model -> Sub msg, view : model -> Html msg } 
    -> Program Never