2017-08-24 8 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から生成されたすべてのコマンドを遮断する効果を持っているアンダー

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

:あなたはRegister.updateから返さCmdを無視して、ネストされたupdate電話を持っています。その子をCmdのままにして、親Cmdにマップして、Cmd.noneの代わりにすべてonRegistrationのケースを返す必要があります。例:

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 –

関連する問題