使用查询读取最后一个值并将其更改为 firebase angularjs 1

using query to read the last value and change it firebase angularjs 1

我有这个数据库

service/
-KSxobYDhjUJeSvu3dC1
 -Accion:"Nueva ronda"
 -Codigo: 3
 -dateTime: 1475284727
 -notify:  0
 -num_mesa: 0
-KSxobptdYSc-qrCSbyU
 -Accion: "Orden cancelada"
 -dateTime: 1475284728
 -notify: 0
 -num_mesa: 0

然后我有这个代码:

ref.orderByChild("notify").equalTo(1).limitToLast(1).on("child_added", function(snapshot) {
    var changedPost = snapshot.val();
    var mykey = snapshot.key;
    if(changedPost.notify == 1 ){
      var message = "New action "
      console.log(serviceArray[mykey].notify);//undefined
      $scope.showActionToast(message);
    } 
});

此代码将读取数据库中的最后一个条目并显示提示框,通知已在 firebase 中插入一个新操作。它显示吐司。

我的问题是我不希望每次重新加载页面时都显示它。

所以我考虑添加一个简单的标志,如果它在 toast 中显示,它会将通知更改为 0。

我的问题是我有 returns 一个 firebaseArray 名为 serviceArray 的服务。当我尝试访问该行以更改它显示未定义的值时。如何更改同一函数中的值?

您最好只跟踪您向用户显示的最后一条消息的时间戳。有了它,您可以查询在该时间戳之后添加的消息:

var timestampOfMostRecentlySeenMessage = null;
if (timestampOfMostRecentlySeenMessage) {
ref.orderByChild("timestamp")
   .startAt(timestampOfMostRecentlySeenMessage)
   .limitToLast(1)
   .on("child_added", function(snapshot) {
       var message = snapshot.val();
       timestampOfMostRecentlySeenMessage = message.dateTime;
   })

现在您只需在页面重新加载之间保持 timestampOfMostRecentlySeenMessage 的值。您可以在 cookie 中、在浏览器的本地存储中甚至在数据库的用户特定部分中执行此操作:

var userRef = firebase.database().ref("users").child(user.uid);
userRef.child("timestampOfMostRecentlySeenMessage").set(timestampOfMostRecentlySeenMessage);

我刚刚在 运行 第一次搜索之后添加了一个声明的标志。

ref.orderByChild("notify").equalTo(1).limitToLast(1).on("child_added", function(snapshot) {
    var changedPost = snapshot.val();
    var mykey = snapshot.key;
    if(changedPost.notify == 1 && $scope.flag== 1 ){
      var message = "New action "
      console.log(serviceArray[mykey].notify);//undefined
      $scope.showActionToast(message);
    } 
   $scope.flag= 1; 

});