2017-03-09 1 views
5

elm-lang tutorial에서 간단한 앱을 수정하여 모델을 먼저 업데이트 한 다음 다른 업데이트를 실행하려고합니다.Elm - 메시지 메시지로 메시지 바꾸기

The 3rd branch has this type: 

({ gifUrl : String, topic : String }, Cmd Msg) 

But the 4th is: 

({ gifUrl : String, topic : String }, Msg) 

그래서 내 메시지가 Cmd를 입력 메시지 있어야 다음 NewTopic 지점이 있기 때문에

update msg model = 
    case msg of 
    MorePlease -> 
     (model, getRandomGif model.topic) 

    NewGif (Ok newUrl) -> 
     ({ model | gifUrl = newUrl }, Cmd.none) 

    NewGif (Err _) -> 
     (model, Cmd.none) 

    -- my addition 
    NewTopic newTopic -> 
     ({ model | topic = newTopic}, MorePlease) 

이 컴파일러에 실패합니다. 나는 Cmd를 메시지로 "내 메시지를 켤 수있는 방법

참고 : 나는이 변화를 만들 수있는 간단한 방법이 인식하지만 느릅 나무를 이해하기 위해 노력하고있어 더 근본적으로

답변

13

없이 정말이 Cmd MsgMsg를 설정해야합니다 update 단지 기능입니다 기억, 그래서 당신은 재귀 적으로 호출 할 수 있습니다

귀하의 NewTopic 경우 핸들러가이 단순화 될 수있다

:..

을3210
NewTopic newTopic -> 
    update MorePlease { model | topic = newTopic} 

당신이 정말로 진정으로이 시나리오에 대한 cmd를 해고하는 느릅 나무 아키텍처를 원하는 경우에 Cmd.none의 간단한 map을 할 수있는 당신의 Msg를 원하는 :

(실제로는 권장하지 않음)
NewTopic newTopic -> 
    ({ model | topic = newTopic}, Cmd.map (always MorePlease) Cmd.none) 

+0

고맙습니다. 이 방법으로 문제를 해결할 수 있습니다. 나는 여전히 "메시지"를 "Cmd Msg"에 "캐스팅"해야 할까? 내가 어떻게하면? – steel

+0

예 : –

+0

으로 답변을 업데이트했습니다. @ChadGilbert : 새로운'Msg'를 발사하여 두 번째 접근법을 권장하지 않는 이유를 좀 더 자세히 설명해 주시겠습니까? – DanEEStar