我正在尝试将用户内容保存为模糊状态,并且在保存后遇到了一个奇怪的 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}
.
我没主意了。一如既往,我们非常感谢您的帮助。
在此先感谢,分贝