Вяз Как сделать собственный декодер событий, чтобы получить положение мыши по оси х / у при перемещении колесика мыши - PullRequest
2 голосов
/ 07 апреля 2019

Я пытаюсь получить координаты x и y мыши во время события перемещения колеса мыши на языке программирования Elm 0.19. Я пытаюсь это с этим пакетом. Смотрите в разделе «Расширенное использование»: https://package.elm -lang.org / пакеты / mpizenberg / вяз-указатель-события / 3.1.0 / Html-Events-Extra-Wheel

Сам пакет не описывает четкий пример, поэтому я искал пример в аналогичном пакете. Смотрите пример в разделе «расширенное использование» на этой странице: https://package.elm -lang.org / пакеты / mpizenberg / вяз-указатель-события / 3.1.0 / Html-Events-Extra-Mouse

Этот пример очень похож на то, что мне нужно, но я также не могу заставить это работать. Получите точно такую ​​же проблему.

Вот мой код, адаптированный из примера к колесу мыши:

module WheelDecoder exposing(..)

import Html exposing (div, text)
import Html.Events.Extra.Wheel as Wheel
import Json.Decode as Decode


type alias WheelEventWithOffsetXY =
  { wheelEvent : Wheel.Event
  , offsetXY : {x: Float, y: Float}
  }

decodeWeelWithOffsetXY : Decode.Decoder WheelEventWithOffsetXY
decodeWeelWithOffsetXY =
  Decode.map2 WheelEventWithOffsetXY
    Wheel.eventDecoder
    offsetXYDecoder

offsetXYDecoder : Decode.Decoder {x: Float, y: Float}
offsetXYDecoder =
  Decode.map2 (\a b -> {x=a,y=b})
    (Decode.field "offsetY" Decode.float)
    (Decode.field "offsetY" Decode.float)

type Msg
  = WheelOffsetXY {x: Float, y: Float}

view = 
  div
    [ (onWheelOffsetXY (\wheelEvent -> WheelOffsetXY (wheelEvent.offsetXY))) ]
    [ (text "mousewheel here") ]


onWheelOffsetXY : (WheelEventWithOffsetXY -> msg) -> Html.Attribute msg
onWheelOffsetXY tag =
  let
    options = { stopPropagation = True, preventDefault = True }
    func = Decode.map tag decodeWeelWithOffsetXY
    attribute = Wheel.onWithOptions options func
  in
    attribute

Когда я пытаюсь скомпилировать с помощью "elm make", я получаю следующую ошибку:

-- TYPE MISMATCH -------------------------------------- src/Map/WheelDecoder.elm

The 2nd argument to `onWithOptions` is not what I expect:

39|     attribute = Wheel.onWithOptions options func
                                                ^^^^
This `func` value is a:

    Decode.Decoder msg

But `onWithOptions` needs the 2nd argument to be:

    Wheel.Event -> msg

Hint: I always figure out the argument types from left to right. If an argument
is acceptable, I assume it is “correct” and move on. So the problem may actually
be in one of the previous arguments!

Это сообщение об ошибке имеет смысл, поскольку я вижу, что существует несоответствие типов, но я понятия не имею, как его решить.

1 Ответ

2 голосов
/ 07 апреля 2019

Похоже, Wheel.eventDecoder предназначался для работы с Html.Events.on или Html.Events.onWithOptions, а не Wheel.onWithOptions. Они были удалены в 0,19 в пользу Html.Events.custom, что немного отличается. Замена onWheelOffsetXY на это, кажется, работает:

onWheelOffsetXY : (WheelEventWithOffsetXY -> msg) -> Html.Attribute msg
onWheelOffsetXY tag =
  let
    options message =
        { message = message
        , stopPropagation = True
        , preventDefault = True
        }
    decoder =
        decodeWeelWithOffsetXY
        |> Decode.map tag 
        |> Decode.map options
  in
  Html.Events.custom "wheel" decoder

PS: Опечатка в decodeWeelWithOffsetXY, кстати. Я оставил опечатку на месте.

PPS: Кроме того, вы просматриваете устаревшую документацию. Вот документация для последней версии .

...