在字段编辑期间关闭Reactivity

时间:2015-03-10 11:42:03

标签: meteor meteor-blaze

我有一个我正在研究的反应形式,需要解决问题。问题是我的用户使用平板电脑/手机而不是较慢的小区连接,有时连接松动。重新建立连接后,Meteor将触发所有DDP消息,从而触发表单中的Reactivity,从而覆盖用户已执行但未保存的任何表单输入。

所以我提出了在文档中保存临时值的想法,因此当用户更改表单输入时,更改将存储在" temp"值直到他们点击保存,此时我只是将临时值复制到实际值并将其清空。在显示时,我只是检查是否有临时值,如果是,则显示该值,如果不显示原始保存值。

这适用于非文本字段,例如单选按钮和复选框,但它对文本输入完全不起作用。

问题似乎与反应性有关。当用户输入时,我在changekeydown上设置了偶数处理程序(我还尝试了keypresskeyup),它只是触发对临时值的更新,例如这样:

'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中文档的反应性?或者只是有一个更好的方法/模式可以让这项工作变得更好?

1 个答案:

答案 0 :(得分:0)

你的表单元素根本不应该连接到任何被动值,否则它们将像你看到的那样被消灭,并且在热代码推送过程中也会消失。

相反,您应该在呈现模板时初始化表单一次。如果在用户编辑表单时更改了基础值,则表单将不会自动更新,这在大多数用例中都是合乎逻辑的。

您仍然需要在用户进行更改时更新本地存储,以便在发生热代码推送时将表单重新置于已编辑的状态。

看看这个,它轻松处理所有这些:

http://viewmodel.meteor.com/