如何在Elm lang 0.17中实现取消公告的autosave?
我有以下情况: 当用户停止在文本区域中键入时,我想等待2秒钟,如果用户在这2秒钟内没有更改文本区域中的任何内容,我想将文本区域的内容保存到服务器。如果用户在这2秒内更改了文本区域中的某些内容,我想重新启动等待超时 在JavaScript中,我将实现如下内容如何在Elm lang 0.17中实现取消公告的autosave?,elm,autosave,debouncing,Elm,Autosave,Debouncing,我有以下情况: 当用户停止在文本区域中键入时,我想等待2秒钟,如果用户在这2秒钟内没有更改文本区域中的任何内容,我想将文本区域的内容保存到服务器。如果用户在这2秒内更改了文本区域中的某些内容,我想重新启动等待超时 在JavaScript中,我将实现如下内容 //Html //JavaScript var textarea=document.querySelector('#textarea'); var textValue=“”; textarea.oninput=函数(e){ textValu
//Html
//JavaScript
var textarea=document.querySelector('#textarea');
var textValue=“”;
textarea.oninput=函数(e){
textValue=e.target.value;
setSaveTimeout();
}
让保存超时;
函数setSaveTimeout(){
如果(保存超时){
clearTimeout(保存超时);
}
saveTimeout=setTimeout(saveToServer,2000);
}
函数saveToServer(){
document.querySelector(“#server”).innerText=
'保存到服务器的值:'+textValue;
}
实现该行为的一种方法是
onInput
事件onInput
处理程序中,
创建一个2秒后触发的任务,
当前值为textarea。
还存储textarea内容任务
,因此可能效率不高
--模型
类型别名模型=
{str:String
,已保存:字符串
}
初始化:(模型,Cmd Msg)
初始化=
(型号“”,Cmd.none)
--更新
输入味精
=更改文本字符串
|保存字符串
|努普()
更新:Msg->Model->(Model,Cmd-Msg)
更新msg模型=
味精案例
NoOp->(型号,命令无)
保存str->
让
_=Debug.log“save”str
新模型=
如果model.str/=str
然后模型
else{model | saved=str}
in(新型号,Cmd.none)
changetextstr->
让
_=Debug.log“textarea”str
cmd=Task.perform NoOp Save Task.success str
in({model | str=str},cmd)
--看法
查看:模型->Html消息
视图模型=
Html.div[]
[Html.textarea[onInput ChangeText][]
,Html.div[][Html.text实现该行为的一种方法是
钩子onInput
事件
在onInput
处理程序中,
创建一个2秒后触发的任务,
当前值为textarea。
还存储textarea内容
检查该值是否已更改
已更改或未更改,如果值未更改,则将其保存
在这里,它不会取消任务
,因此可能效率不高
--模型
类型别名模型=
{str:String
,已保存:字符串
}
初始化:(模型,Cmd Msg)
初始化=
(型号“”,Cmd.none)
--更新
输入味精
=更改文本字符串
|保存字符串
|努普()
更新:Msg->Model->(Model,Cmd-Msg)
更新msg模型=
味精案例
NoOp->(型号,命令无)
保存str->
让
_=Debug.log“save”str
新模型=
如果model.str/=str
然后模型
else{model | saved=str}
in(新型号,Cmd.none)
changetextstr->
让
_=Debug.log“textarea”str
cmd=Task.perform NoOp Save Task.success str
in({model | str=str},cmd)
--看法
查看:模型->Html消息
视图模型=
Html.div[]
[Html.textarea[onInput ChangeText][]
,Html.div[][Html.text显然是Elm中的setTimeout
等价物。我能够找到使用它进行去盎司的方法,但我不确定这是否是最好的方法。此外,下面是一个来自用户组讨论如何去盎司的线程:setTimeout
显然是Elm中的等价物。我能够找到使用它进行去盎司的方法反弹,但我不确定这是否是最好的方法。此外,下面是一个来自用户组的线程,讨论如何消除反弹:
// Html
<textarea id="textarea"></textarea>
<pre id="server"></pre>
// JavaScript
var textarea = document.querySelector('#textarea');
var textValue = "";
textarea.oninput = function (e) {
textValue = e.target.value;
setSaveTimeout();
}
let saveTimeout;
function setSaveTimeout() {
if (saveTimeout) {
clearTimeout(saveTimeout);
}
saveTimeout = setTimeout(saveToServer, 2000);
}
function saveToServer() {
document.querySelector('#server').innerText =
'Value saved to server: ' + textValue;
}