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

时间:2016-05-20 20:07:25

标签: elm

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

我看到它的方式是:

  1. 孩子发送HTTP命令(更新功能)
  2. 该命令被转移到父(更新功能)
  3. 父母将配置添加到命令(这可能吗??)
  4. 最后使用所有必需参数执行命令
  5. 我想在子模块中实现HTTP操作,因此我的应用程序保持模块化,同时将配置保存在一个位置。

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

1 个答案:

答案 0 :(得分:2)

将所有配置详细信息保存在处理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。

LATER EDIT:

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

在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} ! []