2016-10-10 153 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