2016-09-02 3 views
0

elm 및 기능 프로그래밍에 익숙하지 않습니다. 희망이 간단한 질문입니다. 제가하려고하는 것은, 뷰를 변경할 때 elm이 변경하려고하는 뷰를 기반으로 레코드를 가져 오기를 원합니다. currentRoute을 기반으로 urlUpdate 메소드에서이 작업을 수행 할 수 있기를 바랬습니다. 저는 플레이어와 특권을위한 두 가지 뷰를 가지고 있습니다. 둘 다 독립적 인 명령 객체를 가지고 있습니다. 나는 정의 유형을 가진 것이 될 것이라고 생각urlUpdate elm에 다른 리소스로드

The 1st branch has this type:

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

But the 2nd is:

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

나는 이런 일이 왜 확실하지 않다 :

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) 

그러나 나는이 오류를 얻을 :이처럼하려고 노력 승인.

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

여기 당신은 부모에게 자식 명령을 매핑 할 Cmd.map를 사용하는 데 필요한 전체 src

답변

0

입니다 : 대답에 대한

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

Gotcha, 형식 메시지를 보는 것이 의미가 있습니다 = PlayersMsg Players.Messages.Msg | PerksMsg Perks.Messages.Msg | 그림 메시지 그림. 메시지. 메시지 | NavMsg Components.Nav.Messages.Msg'! 정보 주셔서 감사합니다. – smogger914

관련 문제