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

10
我是一位有用的助手,可以为您翻译文本。
我有一个包含我的Elm应用程序的index.html文件。该Elm应用程序使用各种GET请求API,该API由与提供index.html的服务器相同的服务器提供。
为了避免在我的Elm代码中硬编码URL,例如:
url =
    "http://localhost:8080/api/tasks"

有没有一个函数可以返回 window.location.href 的值?

我想做这样的事情:

url =
    getHref() ++ "/api/tasks"

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

3个回答

8
虽然上面的回答解决了你的问题,但我认为有一个更直接的解决方案:
如果应用程序代码是从与您要访问的API相同的服务器(URL)提供的,则无需指定服务器 - 只需使用根相对路径来请求您的api,例如,您可以从您的elm代码中发出对“/ api / tasks”的请求,浏览器将为您处理其余部分。
这就是我在我的部署代码中解决问题的方法。

6

有一个elm-history包,其中带有location函数可用于此目的,但已被弃用且在0.18版本中不存在。

因此,您可能需要使用elm-navigation包,并在模型中明确存储当前位置。

请参考此示例。可以通过以下方式创建具有导航功能的程序:

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"

这个答案现在已经过时了。新的模块是elm/browser。那个模块的问题是它强制你从 Program 切换到 Browser,这是一个更大的改变。 - boxed
这个答案现在已经过时了。新的模块是elm/browser。那个模块的问题是它强制你从 Program 切换到 Browser,这是一个更大的改变。 - undefined

4

使用URL构建器链接到您网站上的另一个页面

无需指定基本URL:

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更改,您绝对不需要担心。因此,您可以轻松地从开发环境切换到生产/暂存环境,无需进行任何其他配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接