2

これが私のシナリオです。ブラウザイベント投稿ページ読み込みで子が追加された場合、タイトルに表示したい。ただし、ページの読み込み時に、追加された子も呼び出されます。

追加された最初の子と、新しいエントリが実際に追加された子をどのように区別できますか。

ありがとう、ティム

4

3 に答える 3

7

Firebaseは、意図的に「初期」データと「新しい」データを区別しません。これにより、ほとんどの場合、初期データの場合と新しいデータの場合の両方を処理するのではなく、データに対して1セットのロジックを記述するだけでよいため、開発がはるかに簡単になります。

この場合、どのように区別したいかがわかります。何をしているのか正確にはわかりませんが、チャットアプリケーションを構築している場合は、「新しい」メッセージであるかどうかではなく、最新のメッセージのタイムスタンプに基づいてタイトルをフラッシュすることをお勧めします。これにより、ページが読み込まれる少し前にメッセージが送信された場合に、ページの読み込み時にタイトルが点滅するようになります。これは望ましい場合があります。他の場合には、未読データのタイトルを実際にフラッシュしたい場合があり、子を「既読」としてマークし、「既読」ビット​​なしで表示される子に対してのみタイトルをフラッシュすることを検討する場合があります。これにより、ページの更新間でシームレスに機能することができます。

「新しい」データがいつ表示されるかをどうしても知る必要がある場合は、「value」イベントタイプで「once」を使用してデータを取得してから、startAtクエリと「child_added」イベントタイプで「on」を使用してみてください。その後、新しいデータを表示します。次のようになります。

var data = new Firebase(...);
data.once("value", function(d) {
  //TODO: display initial state...

  data.startAt(null, <last id in snapshot>).on("child_added", function(newMessSnapshot) {
    //TODO: render new child and flash title bar.
  }
}

または、本当に簡単な方法で実行したい場合は、ページの読み込みから最初のN秒以内に受信したメッセージに対してタイトルが点滅しないようにタイマーを設定するだけです。

お役に立てば幸いです。

于 2012-10-12T02:03:56.870 に答える
4

このSO質問のアプローチを使用して、既存のイベントではなく、新しいイベントのみを受信する呼び出しを設定できます。

したがって、基本的には、とで.on('child_added'...)呼び出しendAtますlimit。まだ1つのエントリ(最後のエントリ)がありますが、無視してかまいません。

// connect to firebase
var fb = new Firebase(...);

// retrieve the last record from `ref` (endAt() tells it to start at the end)
var first = true;
fb.child('table_name').endAt().limit(1).on('child_added', function(snapshot) {

   if( first ) {
       // ignore the first snapshot, which is an existing record
       first = false;
       return;
   }

   // all records after the last continue to invoke this function
   console.log(snapshot.name(), snapshot.val());

});
于 2012-10-12T01:52:59.320 に答える
3

Datasnapshot.name()と制限の両方が減価償却されたので、加藤の答えを更新すると思いました。

もう少しシンプルにすることにしました;)

  // connect to firebase
  var fb = new Firebase("https://your-firebase-ref/");
  var firstTime = false;

  fb.limitToLast(1).on('child_added', function(snapshot) {
    if (firstTime) {
      console.log(snapshot.key(), snapshot.val());
    };
    firstTime = true;
  });

これがお役に立てば幸いです

于 2015-03-14T17:06:01.850 に答える