Elm:更新来自嵌套模块的命令

Elm: Update a command coming from nested module

在我的 Elm 应用程序中,有一个 parent 和一个 child。我希望 child 发送一个 HTTP 命令,然后 parent 会通过添加 child 模型没有的后端配置来动态更新它。

我的看法是:

  1. child发送HTTP命令(更新函数)
  2. 命令转入parent(更新函数)
  3. parent将配置添加到命令(这可能吗??)
  4. 最终执行命令并包含所有必需的参数

我想在 children 模块中实现 HTTP 操作,以便我的应用程序保持模块化,同时将配置保留在一个地方。

欢迎任何帮助。也许不同的方法也能解决我的问题!

将所有配置详细信息保存在处理 Http 请求的模块中。例如,您可以在 Requests.elm

中包含此代码
import Http
import Task

url = "http://ip.jsontest.com/"


getIP : (String -> msg) -> Cmd msg
getIP tagger = 
  Http.getString url
  |> Task.perform (\e -> tagger (toString e)) tagger

然后在组件代码中有类似

的内容
update msg model =
  case msg of 
    GetIP -> model ! [Requests.getIP ShowIP]
    ShowIP str -> {model | ipStr = str} ! [] 

所有配置细节都对组件隐藏。只公开了 API 的访问权限。

后期编辑:

另一种选择是定义和传递动态上下文。您可以在顶层管理此上下文,并在更新内容时传递当前版本。它看起来像这样

在Requests.elm

import Http
import Task

type alias Context =
  { url : String }

getIP : Context -> (String -> msg) -> Cmd msg
getIP ctx tagger = 
  Http.getString ctx.url
  |> Task.perform (\e -> tagger (toString e)) tagger

在组件中:

update ctx msg model =
  case msg of 
    GetIP -> model ! [Requests.getIP ctx ShowIP]
    ShowIP str -> {model | ipStr = str} ! []