Meteorで見守り型のリアルタイムチャットサービスを作ったのですが、Meteorに組み込まれている要素保存機能がうまくいきません。基本的に、現在のチャット メッセージ div は、その中のテキスト入力がフォーカスされている間は更新されないようにする必要があります。ドキュメントには次の指示があります。
手書きアプリケーションのもう 1 つの厄介な問題は、要素の保存です。ユーザーが要素にテキストを入力すると、その要素を含むページの領域が再描画されるとします。が再作成されると、フォーカス、カーソル位置、部分的に入力されたテキスト、およびアクセント付きの文字入力状態が失われるため、ユーザーはでこぼこの乗り物になる可能性があります。
これは、Meteor が自動的に解決するもう 1 つの問題です。フォーカス可能な各要素が一意の ID を持っているか、ID を持つ最も近い親内で一意の名前を持っていることを確認してください。Meteor は、それらを囲むテンプレートが再レンダリングされた場合でもこれらの要素を保持しますが、引き続き子を更新し、属性の変更をコピーします。
これらの指示に従って、入力中に入力フィールドが再レンダリングされないように、入力フィールドに一意の ID を設定しました。しかし、現在、次の2つの問題に直面しています。
他の人のチャット メッセージは入力中に更新されますが、自分のメッセージを入力している間、この更新は一時停止します。入力を止めるとすぐに (入力フィールドにフォーカスがある場合でも)、メッセージが再び更新され始めます。
新しいメッセージが作成され、その div が挿入されると、入力フィールドにフォーカスがある場合でも、メッセージが更新/再レンダリングされます。これにより、フォーカスが突然失われます。
これは、 http://babble.imの同じチャット ルームにいる 2 つの異なるコンピューター/ユーザーでテストできます。
これは Meteor コードのバグですか、それとも私のバグですか? どうすればわかりますか?
編集:
ああ、私は最初の問題の理由を見つけたと思います:
Meteor は通常、必要な更新をバッチ処理し、コードが実行されていないときにのみ実行します。そうすれば、DOM があなたの下から変更されないことを確認できます。反対の動作が必要な場合もあります。たとえば、データベースにレコードを挿入したばかりの場合、DOM を強制的に更新して、jQuery などのライブラリを使用して新しい要素を見つけることができます。その場合は、Meteor.flush を呼び出して、DOM をすぐに最新の状態にします。
ユーザーが入力している間にコードが実行されていたため、DOM が更新されていなかったと思います。使っMeteor.flush
て修理してみます。では、2 つ目の問題はどうなるでしょうか。