2016-10-02 7 views
2

親コンポーネントは、着信ポートの結果を子コンポーネントに渡すことは可能ですか?Elm:親アップデートポート経由の子コンポーネント

私はこの親/子コンポーネントの作成例(https://www.elm-tutorial.org/en/02-elm-arch/06-composing.html)を見てきました。これは素晴らしい例ですが、ポートを介して子供のモデルを更新したいと思います。これは可能ですか?

Example Gist

index.js

var num = 0; 
setInterval(function() { 
    num = num + 1 
    app.ports.tick.send(num) 
},1000); 

Ports.elm

port module Ports exposing (..) 

port tick : (Int -> msg) -> Sub msg 

Main.elm(親)

import Widget 

type Msg 
    = WidgetMsg Widget.Msg 


update : Msg -> AppModel -> (AppModel, Cmd Msg) 
update message model = 
    case message of 
     WidgetMsg subMsg -> 
      let 
       (updatedWidgetModel, widgetCmd) = 
        Widget.update subMsg model.widgetModel 
      in 
       ({ model | widgetModel = updatedWidgetModel }, Cmd.map WidgetMsg widgetCmd) 


subscriptions : AppModel -> Sub Msg 
subscriptions model = 
    Ports.tick WidgetMsg 

Widget.elm(子)

initialModel : Model 
initialModel = 
    { count = 0 
    , tickValue = 0 
    } 


type Msg 
    = Increase 
    | Tick Int 


update : Msg -> Model -> (Model, Cmd Msg) 
update message model = 
    case message of 
     Increase -> 
      ({ model | count = model.count + 1 }, Cmd.none) 

     Tick val -> 
      ({model | tickValue = val}, Cmd.none) 

答えて

2

ポートからint値を受け取る子Msgを指定する必要があります。

Ports.tick (WidgetMsg << Widget.Tick) 
+0

だから、Widget.elmはこの「Tick」メッセージタイプをどうにか公開する必要がありますか? 次のエラーが表示されます。 '変数 'Widget.Msg.Tick'が見つかりません 66 | (WidgetMsg << Widget.Msg.Tick) ^^^^^^^ 修飾子 'Widget.Msg'は有効範囲にありません。 ' –

+0

これはちょうど 'Widget.Tick'です。私は私の答えを更新しました –

+0

ありがとうございます。これは私の問題を解決しました。私はWidget.Tickに直接アクセスできたことを知らなかった –

関連する問題