【发布时间】:2016-12-09 03:19:30
【问题描述】:
我将<div>s 添加到包装器<div> 中,并且我需要能够滚动到每次添加的最后一个。如何在 Elm 中执行此操作?
<div class="messages" style="height: 7em; overflow: scroll">
<div>Anonymous: Hello</div>
<div>John: Hi</div>
</div>
直觉上,我似乎可以调用运行 JavaScript 代码 element.scrollTop = element.scrollHeight 的 port:
AddChatMessage chatMessage ->
( { model | chatMessages = model.chatMessages ++ [ chatMessage ] } , scrollToBottomPort "div.messages" )
问题是scrollToBottom 被调用之前 model 被更新。所以没什么大不了的,我把它转换成Task。但是,即使model 现在首先更新,view 还没有更新。所以我最终滚动到底部的第二个项目!
这可能会导致我在 Elm 中很好奇的一个更普遍的问题,在视图因模型更改而更新后如何运行 Cmd?
【问题讨论】:
-
你可以看看官方的 TodoMVC elm 应用。我认为它就是这样做的。 (现在在移动设备上,否则会有共享链接)。
-
@wintvelt,这是 TodoMVC Elm 应用程序:github.com/evancz/elm-todomvc/blob/master/Todo.elm。我没有看到任何关于滚动的内容,只有一个
Dom.focus电话。index.html和 CSS 文件也没有提供任何自动滚动的指示。 -
你是对的。它不在 todomvc 应用程序中。我的错。将在下面添加答案。