我正在尝试在模糊时保存用户内容,并且在我从未见过的保存后遇到奇怪的用户界面冻结。
模板的简化版本:
{{#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}
,也会发生这种情况。
我没有想法。一如既往,非常感谢您的帮助。
提前致谢, 分贝
答案 0 :(得分:0)
好的,我想我明白了。对于遇到此问题的其他任何人,如果您使用的是Iron Router,则应检查其是否存在不必要的依赖关系。在这种情况下,重新运行的路由器堵塞了工作,因为数据挂钩包含UserSessions集合上的响应式查找请求。我将反应设置为false并指定字段以防止重新计算,并且所有内容都自行平滑。