Вяз обновляет бесконечный цикл - PullRequest
0 голосов
/ 20 марта 2020

Новичок в Elm, поэтому я могу упустить что-то очевидное.

Я работаю над приложением Elm, которое использует annaghi / dnd-list . Я сталкиваюсь с бесконечным l oop обращений к обновлению. Это происходит при нажатии на один элемент, а затем на другой. Вот код:

config : DnDList.Config Player
config =
    { beforeUpdate = \_ _ list -> list
    , movement = DnDList.Free
    , listen = DnDList.OnDrag
    , operation = DnDList.Swap
    }


system : DnDList.System Player Msg
system =
    DnDList.create config DndMsg


type alias Model =
    { navKey : Nav.Key
    , room : WebData Room
    , dnd : DnDList.Model
    , startError : Maybe String
    }

type Msg
    = RoomReceived (WebData Room)
    | DndMsg DnDList.Msg

...

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        RoomReceived room ->
            ( { model | room = room }, Cmd.none )
        DndMsg message ->
            let
                room = model.room
            in
            case room of
                RemoteData.Success actualRoom ->
                    let
                        ( dnd, players ) =
                            system.update message model.dnd actualRoom.players

                        updatedRoom = RemoteData.map 
                            (\roomData -> 
                                { roomData | players = players }
                            ) room
                    in
                    ( { model | dnd = dnd, room = updatedRoom }
                    , system.commands model.dnd
                    )
                _ ->
                    ( model, Cmd.none )

Когда я изменяю строку system.commands model.dnd на Cmd.none, то нет никакого бесконечного цикла вызова функции обновления, но также ничего не происходит. Сообщение, которое продолжает вызываться в библиотеке dnd-list: GotDropElement (Ok dropElement)

Опять же, новость для Elm, так что это может быть плохо сформированный вопрос, но любая помощь приветствуется.

Спасибо !

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Разобрался. Пришлось добавить подписку для прослушивания событий мыши


currentSubs : Model -> Sub Msg
currentSubs model =
    case model.page of
        GameRoomPage pageModel ->
            GameRoom.subscriptions pageModel
                |> Sub.map GameRoomMsg
        _ ->
            always Sub.none model

...

main : Program () Model Msg
main =
    Browser.application
        { view = view
        , init = init
        , update = update
        , subscriptions = currentSubs
        , onUrlRequest = LinkClicked
        , onUrlChange = UrlChanged
        }
0 голосов
/ 21 марта 2020

Попробуйте следовать за потоком от system.commands. Возможно, в конечном итоге он снова отправляет сообщение DndMsg, и именно это и вызывает проблему.

Обычно считается плохой практикой отправлять сообщения от команд.

В случае, если вы не можете решить проблему, поможет рабочий пример проблемного кода c в Ell ie (https://ellie-app.com/new).

...