私は、ポート経由でElmモデルと通信するJavascriptコンポーネントを動的に作成しました。私が持っているParent
でElm 0.18:内容に基づいてSub.mapでメッセージをルーティングするには?
type alias ComponentId =
Int
port sendData : ((ComponentId, String) -> msg) -> Sub msg
type Msg
= ProcessData String
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch [
sendData ProcessData
]
:彼らは彼らのモデルを表しChildComponent
モジュールがあるニレ側でフォームport sendData : ((ComponentId, String) ...
のポートを介してデータを送信
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
ChildMessage componentId msg -> ...
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch
[ Sub.map (ChildMessage componentId) (ChildComponent.subscriptions model.child) ]
明らかに、この結果in
Cannot find variable `componentId`
310| Sub.map (ChildMessage componentId) (ChildComponent.subscriptions (getChildModel (componentId model))) ]
^^^^^^^^^^^
ポートからのデータから「componentId
」を抽出するにはどうすればよいですか?あるいは、私がやっていることはまったく間違っていますか?
更新
私はSub.map
を使用している場合、あなたはそのパラメータとして子モデルを受け入れる機能を必要とするプロジェクトにhttps://github.com/lguminski/ElmMultipleComponentsSubscription
感謝を! @ChadGilbert私たちはほとんどそこにいる。唯一の問題は複数の子供がいることです。あなたが提案したように、 'model.child'を先に提供することはできません。また、メッセージに基づいて動的に計算する必要があります。これを説明するためにhttps://github.com/lguminski/ElmMultipleComponentsSubscriptionを作成しました。 –
私はあなたのデザインをわずかに変更して私の答えを更新し、実際の例を使ってあなたのコードにプルリクエストを作成しました。 –
ありがとう@ChadGilbert。私は、あなたが子供の特定のコミュニケーション(ポートとサブスクリプション)を親のレベルに昇格させ、それを処理することがわかります。実際、これは私が子供の抽象化のリークとしてこれを認識するので、私が避けようとしたものです。私はChildにこれをすべてカプセル化する方法があることを期待していました。しかしおそらくそれは不可能です。私の質問を数日間開いてみましょう。誰も良いアイデアが出てこない場合は、有効な回避策として回答します。再度、感謝します。 –