【问题标题】:Meteor collection update focus and blur latency流星收集更新焦点和模糊延迟
【发布时间】:2015-04-28 14:38:52
【问题描述】:

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

模板的简化版:

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

换句话说,我们遍历 Questions 集合中的一个光标,该集合选择用户必须回答的所有问题,并使用来自 UserSessions 集合的值填充 textarea,其中包含该用户对此的响应问题。对于它的价值,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},也会发生这种情况。

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

提前致谢, 分贝

【问题讨论】:

    标签: meteor meteor-blaze minimongo


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多