2015-04-28 71 views
0

我試圖保存模糊用戶內容,並遇到一個奇怪的用戶界面凍結後,我從來沒有見過的保存。流星收集更新焦點和模糊延遲

模板的簡化版本:

{{#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)塊中執行保存 - 所有相同的結果。必須與發佈更新有關,但即使將發佈功能查詢設置爲{reactive: false},也會發生這種情況。

我出來的想法。一如既往,您的幫助將不勝感激。

由於提前, DB

回答

0

好吧,我想我想通了。對於有此問題的其他人,如果您使用Iron Router,則應檢查它是否有不必要的依賴關係。在這種情況下,重新運行的路由器堵塞了作品,因爲數據鉤子在UserSessions集合中包含被動查找請求。我將反應設置爲false,並指定字段以防止重新計算,並且所有事情都會自行排除。