流星集合更新焦点和模糊延迟

时间:2015-04-28 14:38:52

标签: meteor meteor-blaze minimongo

我正在尝试在模糊时保存用户内容,并且在我从未见过的保存后遇到奇怪的用户界面冻结。

模板的简化版本:

{{#each UserSession.getQuestions}}
   <textearea class='question'>{{UserSession.getVal this._id}}</teaxtarea>
{{/each}}

换句话说,我们迭代Questions集合中的光标,选择用户必须回答的所有问题,然后使用textarea集合中的值填充UserSessions包含此用户对该问题的回复。对于它的价值,textarea实际上是在它自己的模板中(还有其他东西要显示在那里,所以我最好把它们隔离开来。)

用户可以修改他的回复内容,然后我有一个基本上这样做的事件处理程序:

"blur .question": function(e) {
   var val = $(e.target).val();
   var questionId = this._id;
   var userSessionId = Meteor.user().getSessionId();
   var modifier = {$set: {}};
   modifier["$set"]["questions." + questionId + "] = val;
   UserSessions.update({_id: userSessionId}, modifier);
}

更新成功但浏览器在执行保存后冻结了大约一秒钟,因此如果用户点击另一个元素触发模糊,则该元素不会干净地聚焦。这是一个问题,因为我还想在用户输入时进行定期保存,但是当我这样做时,打嗝会中断打字:结果经验非常残酷。

有趣的是,当更新的属性是对象或列表时,浏览器似乎只会冻结。换句话说:

UserSessions.update({_id: userSessionId}, {$set: {"questions.questionId": "someVal"}})导致冻结,UserSessions.update({_id: userSessionId}, {$set: {"lastSavedAt": new Date()}})也是如此。

但是,UserSessions.update({_id: userSessionId}, {$set: {"someOtherProp": "someVal"}})工作正常。

我尝试了几种不同的方法,包括异步客户端模式和在if (Meteor.isServer)块中通过Meteor方法执行保存 - 所有相同的结果。必须与发布更新有关,但即使我将发布函数查询设置为{reactive: false},也会发生这种情况。

我没有想法。一如既往,非常感谢您的帮助。

提前致谢, 分贝

1 个答案:

答案 0 :(得分:0)

好的,我想我明白了。对于遇到此问题的其他任何人,如果您使用的是Iron Router,则应检查其是否存在不必要的依赖关系。在这种情况下,重新运行的路由器堵塞了工作,因为数据挂钩包含UserSessions集合上的响应式查找请求。我将反应设置为false并指定字段以防止重新计算,并且所有内容都自行平滑。