2017-08-24 1 views
1

Je ne parviens pas à déclencher un message de réponse lors de l'envoi d'un message initial.Impossible de déclencher le message de réponse lors de l'envoi du message initial

J'ai un bouton:

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

Je les messages suivants:

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

Le gestionnaire de message qui est appelé via le bouton clic est le suivant:

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

Voici les autres gestionnaires de messages:

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) 

Mon tryRegister mise en œuvre est la suivante:

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 

Voici le code client au module d'orme décrit ci-dessus:

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) 

Attente:

Je pense que quand je cliquez sur le bouton, la navigation a lieu. Cependant, rien ne se passe et je ne comprends pas pourquoi.

Video

Le code source est here.

Répondre

2

Apparemment Cmd.map (...) Cmd.none ne suffit pas pour forcer un autre cycle de mise à jour. Vous pouvez forcer un cycle de mise à jour en envoyant une tâche toujours en cours avec 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 

Note: Il y a de bonnes raisons de ne pas le faire, comme outlined here, mais nous ignorerons pour l'instant à adapter le cadre que vous avez décrit

Cependant, qui seule ne pas faire fonctionner votre code. Vous avez un appel update imbriqué qui ne tient pas compte du revenu de CmdRegister.update:

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

qui mettent en relief a pour effet de bloquer toutes les commandes générées par l'enfant update. Vous devrez conserver cet enfant Cmd, le mapper au parent Cmd et le renvoyer au lieu de Cmd.none dans tous les cas onRegistration.Par exemple:

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

Je suis vraiment reconnaissant pour vos réponses détaillées. Comment puis-je redonner? –

0

Cmd.none est utilisé dans la fonction tryRegister, qui ne fait rien. Je pense que vous devriez utiliser Http.send qui déclenche réellement la boucle de message après la fin de la requête http.

L'exemple le plus court ...,

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

     Response ... -> 
      ... 
+0

J'ai également ce code. Cependant, je n'observe toujours pas la navigation à invoquer: tryRegister: https://github.com/Lambda-Cartel/Nikeza/blob/master/Client/app/Services/Gateway.elm –

+0

En outre, je pensais que Cmd.none a été mappé à un Msg Cmd qui est en fin de compte le msg de réponse que j'ai passé en argument pour tryRegister invoquer? –

+0

Voici une vidéo de mon problème: https://www.youtube.com/watch?v=rdCFDITvW0g –