如何在Elm中获取window.location.href?

时间:2018-08-03 00:00:07

标签: elm location-href

我有一个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。

3 个答案:

答案 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

在提供的应用程序中,该位置为viewviewLocation model.location

在您的应用程序中,例如:

url model =
    model.location.href ++ "/api/tasks"

答案 1 :(得分:3)

使用URL Builder链接到您网站上的注释页面

无需指定基本网址:

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}},然后从浏览器中为您进行排序。

这就是我在部署的代码中解决问题的方式。