2016-10-31 4 views
0

現在Hopを使用していて、main/appモジュール以外の別のページにどのようにルーティングすることができますか? Hopのドキュメントに従うと、特定の種類のメッセージが2種類あります。それらはドキュメントの中ではNavigateToSetQueryと呼ばれています。これらのメッセージをどのようにサブモジュールから呼び出すのですか?サブページから別のページにルーティングする

私は次のことを試してみました:

view = 
    button [ onClick (Main.Types.NavigateTo "test") ] [] 

しかし、これはめちゃくちゃタイピングだろう。

+1

もっと情報/コードを共有できますか?メイン/アプリの外をナビゲートしている場合は、あなたのelmアプリの外にナビゲートしようとしていますか?あなたは "タイプを台無しにする"ことはどういう意味ですか? – wintvelt

+0

@wintvelt更新機能​​がどのように機能するのか、そしてElmで正確にできることを混乱させることは大きなブレークポイントでした。私は一時的にどのように修正したのかという例で自分の質問に自己回答しました。 – DevNebulae

答えて

1

問題はHopではなく、Elm内で親子通信がどのように機能するかを理解しています。軽く言うと、あなたはこのタイプのコミュニケーションをいつ、何のために使うかを注意する必要がありますが、私の場合は、Brian ThicksAlex Lewで、いくつかの良いブログ投稿を読んでいます。特に私の使用事例ではAlexのポストが典型的です。

私がしたことは、次のとおりです。ルーティングするメッセージの種類に別の更新ステートメントを追加しました。これは最善の実装ではなく、Alexがトランスレータのパターンについて説明したように、よりエレガントに行うことができます。

update msg model = 
    case msg of 
     NavigateTo path -> 
      let 
       command = 
        Hop.outputFromPath hopConfig path 
         |> Navigation.newUrl 
      in 
       (model, command) 

     SetQuery query -> 
      let 
       command = 
        model.address 
         |> Hop.setQuery query 
         |> Hop.output hopConfig 
         |> Navigation.newUrl 
      in 
       (model, command) 

     ExampleMsg InterestingMsg exampleInteger -> 
      update (NavigateTo "<path here>") model --Update model in let-statement 

     ExampleMsg subMsg -> 
      let 
       (updatedExampleModel, pageCmd) = 
        Page.Example.State.update subMsg model.exampleModel 
      in 
       ({ model | exampleModel = updatedExampleModel }, Cmd.map ExampleMsg pageCmd) 
+2

elmコミュニティがBrian Hickのブログ記事のように、 "コンポーネント"構造(それぞれ独自のModel、update、view)を持っていることを指摘することは有益かもしれません。代わりに、一般的なプラクティスは "フラット"な構造を持つことです。これは[公式ガイド](https://guide.elm-lang.org/reuse/)でよく説明されています。私の好きな(より大きな)例は、[時間トラッカーSPA](https://github.com/knewter/time-tracker)です。これにはルーティングも含まれますが(HOPではなく) – wintvelt

関連する問題