Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 在字段编辑期间关闭反应性_Meteor_Meteor Blaze - Fatal编程技术网

Meteor 在字段编辑期间关闭反应性

Meteor 在字段编辑期间关闭反应性,meteor,meteor-blaze,Meteor,Meteor Blaze,我有一个反应形式,我正在工作,需要解决一个问题。问题是,我的用户使用平板电脑/手机时,手机连接速度较慢,有时连接松散。当重新建立连接时,Meteor将触发所有DDP消息,从而触发表单中的反应,从而覆盖用户已执行但未保存的任何表单输入 因此,我想到了将临时值保存在文档中的想法,这样当用户更改表单输入时,这些更改将存储在一个“临时”值中,直到它们点击“保存”,此时我只需将临时值复制到实际值并将其清空。在显示时,我只需检查是否有临时值,如果有,则显示该值,如果没有,则显示原始保存的值 这对于单选按钮和

我有一个反应形式,我正在工作,需要解决一个问题。问题是,我的用户使用平板电脑/手机时,手机连接速度较慢,有时连接松散。当重新建立连接时,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。这很容易解决。