2016-09-02 10 views
0

我是榆樹和函數式編程的新手。希望這是一個簡單的問題。我想要做的是,當我更改視圖時,我希望榆樹可以根據它將要改變的視圖來獲取記錄。我希望我可以在基於currentRoute的urlUpdate方法中執行此操作。我有兩個視角,一個視角和一個視角,兩者都有獨立的命令對象。我試圖做這樣的:在urlUpdate上加載不同的資源elm

urlUpdate : Result String Route -> Model -> (Model, Cmd Msg) 
urlUpdate result model = 
    let 
     currentRoute = 
      Routing.routeFromResult result 

     _ = 
      Debug.log "Current Route" currentRoute 
    in 
     if toString currentRoute == "PerksRoute" then 
      ({ model | route = currentRoute } 
      , Perks.Commands.fetchAll 
      ) 
     else if toString currentRoute == "PlayersRoute" then 
      ({ model | route = currentRoute } 
      , Players.Commands.fetchAll 
      ) 
     else 
      ({ model | route = currentRoute }, Cmd.none) 

但是我得到這個錯誤:

The 1st branch has this type:

({ a | route : Route }, Cmd Perks.Messages.Msg) 

But the 2nd is:

({ a | route : Route }, Cmd Players.Messages.Msg) 

我不知道爲什麼發生這種情況,我認爲有這種類型的定義是好。

type Msg 
    = PlayersMsg Players.Messages.Msg 
    | PerksMsg Perks.Messages.Msg 

以下是完整的src

回答

0

您需要使用Cmd.map孩子命令映射到父:

if toString currentRoute == "PerksRoute" then 
    ({ model | route = currentRoute } 
    , Cmd.map PerksMsg Perks.Commands.fetchAll 
    ) 
else if toString currentRoute == "PlayersRoute" then 
    ({ model | route = currentRoute } 
    , Cmd.map PlayersMsg Players.Commands.fetchAll 
    ) 
+0

感謝您的回答,它的作品!你能解釋一下這是怎麼回事,我正在看文檔,但仍然不能完全理解它。 Cmd.map的簽名是(a - > msg) - > Cmd a - > Cmd msg。第一個參數是PlayersMsg,它不是一個函數? – smogger914

+0

'PlayersMsg'和'PerksMsg'都是類型構造函數,每個構造函數接受一個參數並返回一個'Messages.Msg'值。在這個意義上,類型構造函數可以被認爲是函數,這就是爲什麼它們適合作爲第一個參數的'Cmd.map'。 –

+0

難題,這是有道理的看'型消息 = PlayersMsg Players.Messages.Msg | PerksMsg Perks.Messages.Msg | PicturesMsg Pictures.Messages.Msg | NavMsg Components.Nav.Messages.Msg'!謝謝(你的)信息。 – smogger914