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

Rob*_*ert 8 location-href elm

我有一个index.html包含我的 Elm 应用程序的应用程序。Elm 应用程序将各种GETs 用于由与提供index.html.

而不是在我的 Elm 代码中为GETs硬编码 URL ,例如:

url =
    "http://localhost:8080/api/tasks"
Run Code Online (Sandbox Code Playgroud)

有没有返回值的函数window.location.href

我想做类似的事情:

url =
    getHref() ++ "/api/tasks"
Run Code Online (Sandbox Code Playgroud)

这样,如果我将我的服务器移动到其他地方,我将不需要更新我的 Elm 代码中的所有 url。

Mur*_*rph 8

虽然以上回答了您的问题,但我认为有一个更直接的解决方案:

如果应用程序代码是从与您要访问的 API 相同的服务器(URL)提供的,则无需指定服务器 - 只需指定 api 的根相对路径即可,即您可以/api/tasks从您的 elm 代码和浏览器会为你整理剩下的。

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


Igo*_*dov 6

elm-history包具有此location功能,但它已被弃用并且0.18版本不存在。

然后您可能想要使用elm-navigation包并在模型中显式存储当前位置。

请看看这个例子。可以通过以下方式创建带导航的程序:

Navigation.program UrlChange
    { init = init
    , view = view
    , update = update
    , subscriptions = (\_ -> Sub.none)
    }
Run Code Online (Sandbox Code Playgroud)

UrlChange 这是一种消息,它在每次 url 更改时触发,因此您可以处理它并设置当前位置:

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        UrlChange location ->
            ( { model | location = location }
            , Cmd.none
            )
Run Code Online (Sandbox Code Playgroud)

然后纯粹获取location.href模型可访问的任何地方。

在提供的应用程序中,这个地方是viewviewLocation model.location

例如,在您的应用程序中,它是这样的:

url model =
    model.location.href ++ "/api/tasks"
Run Code Online (Sandbox Code Playgroud)