我有一个index.html
,其中包含我的Elm应用程序。 Elm应用程序使用各种GET
来与由index.html
提供服务的服务器使用同一服务器提供的API。
而不是将我的Elm代码中的URL硬编码为GET
,例如:
url =
"http://localhost:8080/api/tasks"
是否有一个函数返回window.location.href
的值?
我想做类似的事情:
url =
getHref() ++ "/api/tasks"
通过这种方式,如果我将服务器移至其他位置,则不需要更新Elm代码中的所有URL。
答案 0 :(得分:4)
有elm-history个软件包带有location
函数,但已弃用,对于0.18
版本不存在。
然后,您可能要使用elm-navigation包并将其当前位置明确存储在模型中。
请查看this example。带有导航的程序可以通过以下方式创建:
Navigation.program UrlChange
{ init = init
, view = view
, update = update
, subscriptions = (\_ -> Sub.none)
}
UrlChange
是一种消息,它会在每次更改URL时触发,因此您可以对其进行处理并设置当前位置:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
UrlChange location ->
( { model | location = location }
, Cmd.none
)
然后完全在可以访问模型的任何地方获取location.href
。
在提供的应用程序中,该位置为view
:viewLocation model.location
在您的应用程序中,例如:
url model =
model.location.href ++ "/api/tasks"
答案 1 :(得分:3)
无需指定基本网址:
import Url.Builder exposing (absolute)
url = absolute [ "api", "tasks" ] []
-- results in "http://localhost:8080/api/tasks"
-- if working in your developer environment
-- the URL will automatically change in production
-- to the correct URL assuming you don't have any crazy set ups
如果您的服务器URL发生更改,您绝对不必担心。因此,您无需任何其他配置即可轻松地从开发环境切换到生产/登台环境。
答案 2 :(得分:2)
尽管以上内容回答了您的问题,但我认为有一个更直接的解决方案:
如果应用代码是从与您要访问的API相同的服务器(URL)提供的,则无需指定服务器-只需指定api的根相对路径即可,即您可以向{{ 1}},然后从浏览器中为您进行排序。
这就是我在部署的代码中解决问题的方式。