2017-08-24 232 views
1

发送初始消息时,无法触发响应消息。发送初始消息时无法触发响应消息

我有一个按钮:

button 
    [ class "register" 
    , value "Create Account" 
    , onClick Submit 
    ] 

我有以下消息:

type Msg 
    = Submit 
    | Response (Result Http.Error JsonProfile) 

是通过点击按钮调用的消息处理程序如下:

update : Msg -> Form -> (Form, Cmd Msg) 
update msg model = 
    case msg of 
     Submit -> 
      (model, runtime.tryRegister model Response) 
     ... 

这里的其他消息处理程序:

update : Msg -> Form -> (Form, Cmd Msg) 
update msg model = 
    case msg of 
     Submit -> 
      (model, runtime.tryRegister model Response) 

     Response (Ok json) -> 
      (model, Navigation.load <| "/#/portal/1") 

     Response (Err error) -> 
      (model, Cmd.none) 

我tryRegister实现如下:

tryRegister : Form -> (Result Http.Error JsonProfile -> msg) -> Cmd msg 
tryRegister form msg = 

     let 
      jsonProfile = 
       JsonProfile 1 form.firstName form.lastName form.email 

      newMsg v = 
       msg 
     in 
      Cmd.map (newMsg <| Result.Ok jsonProfile) Cmd.none 

这里的客户端代码榆树模块上面描述:

onRegistration : Registration.Msg -> Model -> (Model, Cmd Msg) 
onRegistration subMsg model = 
    let 
     (form, _) = 
      Registration.update subMsg model.registration 
    in 
     case subMsg of 
      Registration.Submit -> 
       ({ model | registration = form }, Cmd.none) 

      Registration.Response result -> 
       case result of 
        Result.Ok jsonProfile -> 
         let 
          newUser = 
           jsonProfileToProvider jsonProfile 

          newState = 
           { model 
            | registration = form 
            , portal = 
             { initPortal 
              | provider = newUser 
              , requested = Domain.EditProfile 
              , linksNavigation = False 
              , sourcesNavigation = False 
             } 
           } 
         in 
          (newState, Navigation.load <| "/#/portal/" ++ getId newUser.profile.id) 

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

后市展望:

我希望,当我点击按钮,导航就会发生。 但是,没有任何反应,我不明白为什么。

Video

源代码here

回答

2

显然Cmd.map (...) Cmd.none不足以迫使另一个更新周期。您可以通过使用Task.perform发送始终成功的任务来强制更新周期。

tryRegister : Form -> (Result Http.Error JsonProfile -> msg) -> Cmd msg 
tryRegister form msg = 
    JsonProfile 1 form.firstName form.lastName form.email 
     |> Result.Ok 
     |> msg 
     |> Task.succeed 
     |> Task.perform identity 

注:有很好的理由不这样做,因为outlined here,但我们会忽略那些现在适合你描画

但是框架,仅此便可不要让你的代码工作。你有一个嵌套update调用,它忽略来自Register.update返回Cmd

(form, _) = 
    Registration.update subMsg model.registration 

这强调具有阻止从孩子update产生的所有命令的效果。您需要保留该子女Cmd,将其映射到父母Cmd,然后在onRegistration个案内返回,而不是Cmd.none。例如:

onRegistration : Registration.Msg -> Model -> (Model, Cmd Msg) 
onRegistration subMsg model = 
    let 
     (form, subcmd) = 
      Registration.update subMsg model.registration 

     regcmd = 
      Cmd.map OnRegistration subcmd 
    in 
     case subMsg of 
      Registration.FirstNameInput _ -> 
       ({ model | registration = form }, regcmd) 

      ... 
+0

我非常感谢您的详细解答。我该如何回馈? –

0

Cmd.none用于tryRegister函数,它什么都不做。我想你应该使用Http.send这实际上在http请求完成后触发消息循环。

最短的例子...,

update msg model = 
    case msg of 
     Submit -> 
      (model, Http.send Response request) 

     Response ... -> 
      ... 
+0

我也有这样的代码。但是,我仍然没有注意到要调用的导航:tryRegister:https://github.com/Lambda-Cartel/Nikeza/blob/master/Client/app/Services/Gateway.elm –

+0

另外,我认为Cmd.none被映射到一个Cmd Msg,它最终是我作为tryRegister调用的参数传入的响应消息? –

+0

下面是我的问题视频:https://www.youtube.com/watch?v=rdCFDITvW0g –