элементы без href или с пустым href вызывают перезагрузку страницы при использовании Browser.application в Elm 0.19 - PullRequest
0 голосов
/ 08 октября 2018

Пустые ссылки, т.е. a элементы без атрибута href или с href "" вызывают перезагрузку страницы при использовании с Browser.application в Elm 0.19.

Вот минимальный, полный и проверяемый пример:

module Main exposing (main)

import Browser
import Browser.Navigation
import Html exposing (..)
import Url


type alias Model =
    ()


type Msg
    = UrlRequested Browser.UrlRequest
    | UrlChanged Url.Url


init () _ _ =
    ( (), Cmd.none )


update msg model =
    case msg of
        UrlRequested (Browser.Internal _) ->
            ( model, Cmd.none )

        UrlRequested (Browser.External url) ->
            ( model, Browser.Navigation.load url )

        UrlChanged _ ->
            ( model, Cmd.none )


view model =
    { title = ""
    , body = [ a [] [ text "click to reload" ] ]
    }


main =
    Browser.application
        { init = init
        , view = view
        , update = update
        , subscriptions = \_ -> Sub.none
        , onUrlRequest = UrlRequested
        , onUrlChange = UrlChanged
        }

Это нестандартное поведение, так как такие ссылки не должны рассматриваться как гиперссылки пользовательским агентом, и большое количество кода зависит от этого поведения, среди них elm-bulma.

1 Ответ

0 голосов
/ 08 октября 2018

Это вызвано тем, что Elm подключает onclick прослушиватели событий ко всем элементам a, чтобы иметь возможность перехватывать и обрабатывать маршрутизацию внутри.Он анализирует URL-адрес и классифицирует его как Internal или External, где пустой или пропущенный href, по-видимому, считается External.Затем Elm создаст Msg, используя конструктор типа, переданный в Browser.application через onUrlRequest', run update passing this Msg`, и здесь мы можем перехватить и обработать его соответствующим образом.

Решение состоит в том, чтобыдобавьте еще один шаблон к update, который соответствует пустому внешнему URL, где мы просто ничего не делаем вместо попытки load URL, как мы обычно делаем с другими внешними URL.Что касается примера вопроса, следующая обновленная функция update должна помочь:

update msg model =
    case msg of
        UrlRequested (Browser.Internal _) ->
            ( model, Cmd.none )

        UrlRequested (Browser.External "") ->
            ( model, Cmd.none )

        UrlRequested (Browser.External url) ->
            ( model, Browser.Navigation.load url )

        UrlChanged _ ->
            ( model, Cmd.none )
...