有没有办法简单地转到榆树的新网页,类似于点击链接?
我有一个button可以在点击时,我想将用户带到另一个网页.我知道我可以制作一个a元素并使用CSS来设置它像按钮一样.但是,我正在使用elm-mdl创建材质设计精简按钮,我想知道如何做到这一点,无论如何.
我已经尝试创建一个GoTo String Msg并点击按钮点击Button.onClick (GoTo "newpage.html"),但我不知道该放什么Cmd.我尝试了以下方法:
GoTo url ->
( model, Navigation.newUrl url )
Run Code Online (Sandbox Code Playgroud)
但这只会使地址栏中的URL发生变化,用户实际上并未转到新的URL ...我可以使用端口并编写一些简单的JavaScript代码来调用window.location.href = 'newpage.html',我只是希望有一个简单的标准Elm这样做的方式.
我将<div>s 添加到包装器中<div>,我需要能够滚动到每次添加的最后一个.我怎么在榆树做这个?
<div class="messages" style="height: 7em; overflow: scroll">
<div>Anonymous: Hello</div>
<div>John: Hi</div>
</div>
Run Code Online (Sandbox Code Playgroud)
直观地说,似乎我可以调用一个port运行JavaScript代码element.scrollTop = element.scrollHeight:
AddChatMessage chatMessage ->
( { model | chatMessages = model.chatMessages ++ [ chatMessage ] } , scrollToBottomPort "div.messages" )
Run Code Online (Sandbox Code Playgroud)
问题是scrollToBottom被调用之前的model得到更新.所以没什么大不了的,我把它转换成了一个Task.但是,即使model现在首先更新,view也没有更新.所以我最终滚动到底部的第二个项目!
这可能会导致我对Elm感到好奇的一个更普遍的问题,Cmd由于模型的变化,如何更新视图后运行?
有没有办法在Elm中定义没有参数的订阅端口?
就像是:
port updateTime : () -> Sub msg
Run Code Online (Sandbox Code Playgroud)
使用此代码,我收到"端口'updateTime'具有无效类型"的错误
随着代码:
port updateTime : (String -> msg) -> Sub msg
Run Code Online (Sandbox Code Playgroud)
它正在工作,但我不需要从javascript函数向Elm发送任何内容.
我希望在我的Elm网页中有一个代码编辑器小部件,如CodeMirror或Ace.不幸的是,CodeMirror和Ace不能与Elm一起工作,因为他们修改了DOM(至少我理解为什么它们不起作用).
我需要的东西至少比<textarea>学生提交代码更好.并为我们显示代码.现在只需自动缩进和语法高亮.
Cmd更新视图后,有没有一种直接执行方法的方法?特别是,我试图textarea在按下特定键(例如Enter键)时将光标重新定位在上。在我的update职能中,我有:
case keyboardEvent.key of
"Enter" ->
( modelAfterEnterPressed model keyboardEvent.selectionStart, setCursor model.cursor )
"Tab" ->
....
Run Code Online (Sandbox Code Playgroud)
我的setCursor端口被调用,相应的JavaScript代码正确调用textarea的setSelectionRange功能。而随后榆树叫我的view功能,更新textarea的内容。不幸的是,这抹去了我的光标位置。
我需要的textarea的内容进行更新之前打电话textarea.setSelectionRange()在我的JavaScript端口。有什么方法可以执行此操作而不求助于setTimeout哪一种方法可能并不总是有效,并且可能在超时时间内导致闪烁?