我有一个我正在研究的反应形式,需要解决问题。问题是我的用户使用平板电脑/手机而不是较慢的小区连接,有时连接松动。重新建立连接后,Meteor将触发所有DDP消息,从而触发表单中的Reactivity,从而覆盖用户已执行但未保存的任何表单输入。
所以我提出了在文档中保存临时值的想法,因此当用户更改表单输入时,更改将存储在" temp"值直到他们点击保存,此时我只是将临时值复制到实际值并将其清空。在显示时,我只是检查是否有临时值,如果是,则显示该值,如果不显示原始保存值。
这适用于非文本字段,例如单选按钮和复选框,但它对文本输入完全不起作用。
问题似乎与反应性有关。当用户输入时,我在change
和keydown
上设置了偶数处理程序(我还尝试了keypress
和keyup
),它只是触发对临时值的更新,例如这样:
'change .responseInput, keydown .responseInput': function(event, tmpl) {
var response = Blaze.getData(tmpl.$('.headerDiv')[0]);
var val = response.lastResponseValue;
if (!val) {
val = new ResponseValue({
response_id: response.id
});
}
val.tempValues = getSelectedValues(tmpl.$('div.responseDiv'));
val.save();
}
在此事件处理程序中,response.lastResponseValue
只返回最后一个响应值(我维护用户输入的值的历史记录),getSelectedValues()
获取表示表单控件周围的DIV的DOM元素并将其清除选定的值,可以是textbox / textarea的单个String,也可以是复选框的String值数组。这些作品按预期工作。
val.save()
不起作用。选择文本输入字段并快速键入时,经验是随机跳过/忽略/删除键入的文本,很可能是由于反应性。我尝试在Tracker.nonreactive()
中包装事件处理程序以关闭反应,但这似乎没有帮助。我猜是因为save()
不是被动的,而是find()
。
我考虑过将临时值内容分成单独的文档。那么实际值不会被触及,只有附加到它上面的临时值,但是我最终需要编写仍然返回临时值的代码,否则原始问题根本不会修复,在这种情况下,我想我会回到同一条船上,用户和反应之间存在竞争条件。
有没有办法暂时关闭Meteor / Blaze中文档的反应性?或者只是有一个更好的方法/模式可以让这项工作变得更好?
答案 0 :(得分:0)
你的表单元素根本不应该连接到任何被动值,否则它们将像你看到的那样被消灭,并且在热代码推送过程中也会消失。
相反,您应该在呈现模板时初始化表单一次。如果在用户编辑表单时更改了基础值,则表单将不会自动更新,这在大多数用例中都是合乎逻辑的。
您仍然需要在用户进行更改时更新本地存储,以便在发生热代码推送时将表单重新置于已编辑的状态。
看看这个,它轻松处理所有这些:
添