2017-03-05 6 views
0

私のアプリケーションはルーティングのためにNavigateを使用しますが、何らかの理由で最初のhttpコマンドがいずれかのサブモジュールに対して起動していません。親モジュールと子モジュールの間にコマンドが配線される方法に何か問題がある可能性がありますが、問題を特定するための助けを借りることができます。コードと構造は、elm-taco(https://github.com/ohanhi/elm-taco)の例をモデルにしています。以下は、コードの関連部分の抜粋であり、コンパイラエラーはありません。Elmサブモジュールのinitコマンドが起動しない

Main.elm

init : Flags -> Location -> (AppModel, Cmd Msg) 
init flags location = 
     ( startModel 
     , Http2.get ("localhost:4000/graphql?query=" ++ encoded) HandleLogDataResponse decoder) 

update : Msg -> AppModel -> (AppModel, Cmd Msg) 
update msg model = 
     case msg of 
      HandleLogDataResponse webData -> 
       updateLogData model webData 
      RouterMsg routerMsg -> 
       updateRouter model routerMsg 

updateLogData : AppModel -> WebData LogData -> (AppModel, Cmd Msg) 
updateLogData model webData = 
    case webData of 
     Success logdata -> 
      case model.appState of 
       NotReady time -> 
        let 
         initTaco = 
          { currentTime = time 
          , logdata = logdata 
          } 
         (initRouterModel, routerCmd) = 
          Router.init initTaco model.location 
        in 
         ({ model | appState = Ready initTaco initRouterModel } 
         , Cmd.map RouterMsg routerCmd 
         ) 

       Ready taco routerModel -> 
        ({ model | appState = Ready (updateTaco taco (UpdateLogData logdata)) routerModel } 
        , Cmd.none 
        ) 

Router.elm

init : Taco -> Location -> (Model, Cmd Msg) 
init taco location = 
    let 
     (chatModel, chatCmd) = 
       Chat.initModel taco 
    in 
     ({ chatModel = chatModel 
     , route = parseLocation location} 
     , Cmd.map ChatMsg chatCmd 
    ) 

update: Msg -> Model -> (Model,Cmd Msg, TacoUpdate) 
update msg model = 
    case msg of 
     ChatMsg chatMsg -> 
      updateChat model chatMsg 

updateChat : Model -> Chat.Msg -> (Model, Cmd Msg, TacoUpdate) 
updateChat model chatMsg = 
    let 
     (nextChatModel, chatCmd, tacoUpdate) = 
      Chat.update chatMsg model.chatModel 
    in 
     ({model | chatModel = nextChatModel } 
     , Cmd.map ChatMsg chatCmd 
     , tacoUpdate) 

Chat.elm

答えて

2
initModel : Taco -> (Model, Cmd Msg) 
initModel taco = 
    let 
     startModel = { newMessage = "" 
        , messages = taco.messages 
        , response = "Waiting for a response..." 
        , logs = [] 
        } 
     cmd = Http.send FetchHNTopStories request 

    in 
      (startModel 
      , cmd 
     ) 

結果を得るためにコマンドを実行するには、ランタイムに到達するための方法を提供する必要があります。

これはmainによって行われます。 Cmdがアプリのmainに届かないと、決して実行されません。

与えたコードサンプルでは、​​サブモジュールinitがどのようにmainになるのかは分かりません。従来、Main.elmにあるinitはサブモジュールのinitを使用し、Cmd.mapサブモジュールのinit CmdsとCmd.batchを残りのメインinitCmdsと共に使用する必要があります。

+0

ご回答いただきありがとうございます。私はChat.elmの 'init'がRouter.elmの' init'とMain.elmのupdateLogDataを介して 'main'に到達したと考えました。これはMainのinit/HandleLogDataResponseによって呼び出されます。これは基本的に 'elm-taco'の例です。 –

+0

ああ、申し訳ありません.Httpハンドラで実際にinitを呼び出すという事実は忘れました。 メッセージの周りに 'Debug.log'を追加して、何が起きているのかを見てください。たぶん 'Http2.get'リクエストが失敗し、' Router.init'が評価されるブランチには決して行きません。 – pdamoc

+0

http要求は成功します。私はデバッグしようとします。ログ。ありがとう –

関連する問題