使用Meteor进行就地编辑:无法读取属性';parentNode';空的

使用Meteor进行就地编辑:无法读取属性';parentNode';空的,meteor,Meteor,我已经为网络模型设置了适当的编辑设置。有两个输入字段,分别用于模型的标题和说明。当用户单击标题时,它会为一个切换出标记,就像在规范的TODO示例中一样 我正在向相关模板添加事件,如下所示: Template.network_edit.events = {} Template.network_edit.events['click #network-description'] = -> Session.set('editing_network_description',true)

我已经为
网络
模型设置了适当的编辑设置。有两个输入字段,分别用于模型的
标题
说明
。当用户单击标题时,它会为一个
切换出
标记,就像在规范的TODO示例中一样

我正在向相关模板添加事件,如下所示:

Template.network_edit.events = {}

Template.network_edit.events['click #network-description'] = -> 
    Session.set('editing_network_description',true)
    Meteor.flush()
    focus_field_by_id('network-description-input')

Template.network_edit.events['click #network-title'] = -> 
    Session.set('editing_network_title',true)
    Meteor.flush()
    focus_field_by_id('network-title-input')
focus\u field\u by\u id
函数为

  var focus_field_by_id = function (id) {
  var input = document.getElementById(id);
  if (input) {
    input.focus();
    input.select();
  }
};
一切正常,但当我点击
#网络描述
,我在控制台中看到一个错误:

Uncaught TypeError: Cannot read property 'parentNode' of null
liveui.js
的第600行抛出。当我点击
#网络标题
,我没有收到这样的错误

如果我颠倒事件顺序,将
#网络标题
事件放在第一位,然后将
网络描述
放在第二位,那么当我点击
#网络标题
时会收到错误。通常,添加的第一个事件会引发此错误,但不会引发后续事件


正如我所说,一切看起来都正常工作(输入显示、获得焦点等),但错误令人不安,我可能遗漏了一些东西。

啊哈,我能够重现这一点

这是一个在事件处理期间DOM发生变化时发生的错误。调用Meteor.flush()后,事件的原始目标不再位于模板中。Meteor的事件处理代码阻塞,可能是在检查第二个处理程序是否适用时,因此第一个处理程序似乎中断了。这个错误是无害的,你没有做错任何事

事件处理正在为下一个版本重写,对于这种情况,我有一个回归测试,新代码已经通过了


感谢您的报告和耐心。

这个项目部署在我可以查看的地方了吗?请发布您的
focus\u field\u by\u id
函数。我添加了focus\u field\u by\u id函数的定义,尽管即使这些调用被注释掉,也会抛出错误。我现在还没有把它发布到任何地方,但是我会发布的。嗯,我不认为这段代码中有bug。该错误意味着未定义某些内容,在meteor中,这通常意味着数据库尚未完成加载。或者,当您需要对象时,模板帮助程序返回null。或者尚未设置会话变量。这些是我想去的地方。谢谢你的意见。问题可以缩小到
Meteor.flush()
调用。如果我将其注释掉,我不会收到错误。如果我将最后两行代码包装到Meteor.defer中,就像
Meteor.defer Meteor.flush()中一样,我可以让一切都正常运行;按id(“网络描述输入”)聚焦字段非常奇怪。尽管如此,
Meteor.defer
似乎修复了它,这进一步支持了某些东西还没有完成加载的想法
Meteor.defer
只是setTimeout的包装。我希望我能给出一个真实的答案——对不起。