0

我正在尝试将用户内容保存为模糊状态,并且在保存后遇到了一个奇怪的 UI 冻结,这是我以前从未见过的。

模板的简化版本:

{{#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}.

我没主意了。一如既往,我们非常感谢您的帮助。

在此先感谢,分贝

4

1 回答 1

0

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

于 2015-05-01T18:26:50.017 回答