ユーザー コンテンツをぼかして保存しようとしていますが、保存後にこれまでに見たことのない奇妙な 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);
}
更新は成功しますが、ブラウザーは保存の実行後約 1 秒間フリーズします。そのため、ユーザーが別の要素をクリックしてぼかしがトリガーされた場合、その要素はきれいにフォーカスされません。ユーザーが入力している間に定期的に保存したいので、これは問題ですが、それを行うと、しゃっくりが入力を中断します。
興味深いのは、更新されるプロパティがオブジェクトまたはリスト内にある場合にのみブラウザがフリーズするように見えることです。言い換えると:
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 Method による保存の実行など、いくつかの異なるアプローチを試しましたが、結果はすべて同じでした。パブリケーションの更新と関係があるはずですが、パブリッシュ関数のクエリを に設定しても発生します{reactive: false}
。
私はアイデアがありません。いつものように、あなたの助けは大歓迎です。
前もってありがとう、デシベル