Elm更新无限循环

Elm更新无限循环,elm,Elm,埃尔姆是新来的,所以我可能错过了一些明显的东西 我正在开发一个Elm应用程序,它使用。我遇到了一个无限循环的更新调用。当单击一个元素,然后单击另一个元素时,会发生这种情况。代码如下: config : DnDList.Config Player config = { beforeUpdate = \_ _ list -> list , movement = DnDList.Free , listen = DnDList.OnDrag , operation

埃尔姆是新来的,所以我可能错过了一些明显的东西

我正在开发一个Elm应用程序,它使用。我遇到了一个无限循环的更新调用。当单击一个元素,然后单击另一个元素时,会发生这种情况。代码如下:

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 )

当我将line system.commands model.dnd更改为Cmd.none时,就不会无限循环调用update函数,但也不会发生任何事情。在dnd列表库中不断被调用的消息是GotDropElement Ok dropElement

同样,对于Elm来说,这是一个新的问题,所以这可能是一个格式不好的问题,但任何帮助都是非常感谢的


谢谢

尝试按照system.Command中的流程进行操作。可能它最终会再次发送消息DndMsg,这就是导致问题的原因

通常认为从命令发送消息不是一种好的做法


如果您无法解决这个问题,在Ellie中提供问题代码的工作示例会有所帮助。

解决了这个问题。必须添加订阅才能收听鼠标事件


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
        }