Meteor 在字段编辑期间关闭反应性
我有一个反应形式,我正在工作,需要解决一个问题。问题是,我的用户使用平板电脑/手机时,手机连接速度较慢,有时连接松散。当重新建立连接时,Meteor将触发所有DDP消息,从而触发表单中的反应,从而覆盖用户已执行但未保存的任何表单输入 因此,我想到了将临时值保存在文档中的想法,这样当用户更改表单输入时,这些更改将存储在一个“临时”值中,直到它们点击“保存”,此时我只需将临时值复制到实际值并将其清空。在显示时,我只需检查是否有临时值,如果有,则显示该值,如果没有,则显示原始保存的值 这对于单选按钮和复选框之类的非文本字段非常有效,但对于文本输入来说,它根本不起作用 问题似乎在于反应性。当用户输入时,我在Meteor 在字段编辑期间关闭反应性,meteor,meteor-blaze,Meteor,Meteor Blaze,我有一个反应形式,我正在工作,需要解决一个问题。问题是,我的用户使用平板电脑/手机时,手机连接速度较慢,有时连接松散。当重新建立连接时,Meteor将触发所有DDP消息,从而触发表单中的反应,从而覆盖用户已执行但未保存的任何表单输入 因此,我想到了将临时值保存在文档中的想法,这样当用户更改表单输入时,这些更改将存储在一个“临时”值中,直到它们点击“保存”,此时我只需将临时值复制到实际值并将其清空。在显示时,我只需检查是否有临时值,如果有,则显示该值,如果没有,则显示原始保存的值 这对于单选按钮和
change
和keydown
(我还尝试了keypress
和keydup
)上设置了一个偶数处理程序,它只需对临时值进行如下更新:
'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的单个字符串,或复选框的字符串值数组。这些部件工作正常
不起作用的是val.save()
。当选择文本输入字段并快速键入时,经验是键入的文本被随机跳过/忽略/删除,很可能是由于反应性。我尝试将事件处理程序包装在Tracker.nonreactive()
中以关闭反应性,但这似乎没有帮助。我之所以这么猜测,是因为不是save()
是被动的,而是find()
我考虑将临时值内容分离到一个单独的文档中。然后实际值就不会被触及,只有附加到它的temp,但我最终需要编写仍然返回temp值的代码,否则最初的问题将根本无法解决,在这种情况下,我想我会回到同一条船上,用户和反应性之间存在竞争条件
有没有办法暂时关闭Meteor/Blaze中文档的反应性?还是有更好的方法/模式可以让这项工作更好?您的表单元素不应该连接到任何被动值,否则它们会像您看到的那样被删除,并且在热代码推送过程中也会被删除 相反,在呈现模板时,应该只初始化表单一次。如果在用户编辑表单时基础值发生变化,那么表单将不会自动更新,这在大多数用例中是合乎逻辑的 但是,在用户进行更改时,您仍然需要更新本地存储,以便在发生热代码推送时可以将表单恢复到编辑状态 看看这个,它可以轻松处理所有这些问题:
Tim所以,我一直在阅读ViewModel。我想这正是我需要的。我在交换它时遇到的一个问题是,当值可以是一个项目数组时,比如当您有一堆复选框时,我还没有找到处理绑定的方法。他们的复选框绑定示例假设每个复选框对应一个VM。我忽略了将多个复选框绑定到一个数组的情况。我将更新ViewModel。这很容易解决。