访问推入数组的项目

Accessing items pushed into array

在我的 firebase 数据中,我有一个游戏对象和一个玩家对象。嵌套在玩家对象中的是与游戏唯一键匹配的唯一键,这些是包含玩家的游戏。然后嵌套在游戏唯一键中(在玩家对象内)是进入该特定游戏的实际玩家的键。我想要完成的是仅对当前用户 (player.uid) 已加入的游戏进行 ng-repeat。因此,在下面的代码中,我正在检查玩家 ID(在玩家对象内)是否与他们的 firebase UID 匹配,如果匹配,我将其推入空数组,然后循环应该遍历该数组,如果键该数组与游戏对象中的键匹配...它 returns 是;将 class 从显示 none 的 'hideGames' 切换到显示块的 'show games'。如果我将键添加到注释掉的 gamesToShow 数组,而不是在应该从循环中填充的实际 gamesToShow 数组中,这会很好地工作。我在这里做错了什么?我试过移动 gamesToshow 数组,但它仍然是空的。我需要做什么才能在 for 循环中使用它?在此先感谢,我发布了相关代码,如果需要任何其他信息,请告诉我。谢谢大家。

"games":{  
      "-JwYx6ckhITt2GWOmzLy":{  
         "date":"8/27/2015",
         "host":"Anthony DeVenuto",
         "hostEmail":"anthonydevenuto@gmail.com",
         "location":{  
            "address":"1234 Crooked Rd, Chicago Illl",
            "course":"Crooked Stick"
         },
         "name":"Crooked Stick Run",
         "rules":{  
            "amount":"21",
            "format":"Match Play",
            "holes":"9",
            "perBirdie":"DOES NOT APPLY",
            "perSkin":"DOES NOT APPLY",
            "time":"12:00pm"
         }
      },
      "-Jwi64w0weox4vxIbz8J":{  
         "date":"8/23/2015",
         "host":"Anthony DeVenuto",
         "hostEmail":"anthonydevenuto@gmail.com",
         "location":{  
            "address":"1234 fdsadgad",
            "course":"West Hills Gathering"
         },
         "name":"West Side Shuffle",
         "rules":{  
            "amount":"21",
            "format":"Match Play",
            "holes":"18",
            "perBirdie":"DOES NOT APPLY",
            "perSkin":"DOES NOT APPLY",
            "time":"1:00pm"
         }
      },
      "-Jwx-f7HnjIKdkMnM16D":{  
         "date":"8/23/2015",
         "host":"Andy",
         "hostEmail":"andy@andy.com",
         "location":{  
            "address":"1234 First Ave",
            "course":"WestCode Hills"
         },
         "name":"WestCode Hustle",
         "rules":{  
            "amount":"12",
            "format":"Match Play",
            "holes":"18",
            "perBirdie":"DOES NOT APPLY",
            "perSkin":"DOES NOT APPLY",
            "time":"1:00pm"
         }
      }
   },
   "players":{  
      "-JwYx6ckhITt2GWOmzLy":{  
         "-Jx1uw6iY87HoNJfAngF":{  
            "email":"andy@andy.com",
            "id":"simplelogin:19",
            "name":"Andy"
         }
      },
      "-Jwi64w0weox4vxIbz8J":{  
         "-Jx1uxoJ0H8Pycp7V12s":{  
            "email":"andy@andy.com",
            "id":"simplelogin:19",
            "name":"Andy"
         }
      },
      "-Jwx-f7HnjIKdkMnM16D":{  
         "-Jx1nbKxyLcbwFFIGjh4":{  
            "email":"anthonydevenuto@gmail.com",
            "id":"simplelogin:22",
            "name":"Anthony DeVenuto"
         }
      }
   },
   "users":{  }
}

JS

var player = auth.$getAuth();

  $scope.displayGames = function(game){
  var gamesToShow = [];
  // var gamesToShow = ['-JwYx6ckhITt2GWOmzLy', '-Jwi64w0weox4vxIbz8J'];

  var playersRef = fire.child('players');
  playersRef.on('value', function(snapshot){
    var gamesObjects = snapshot;
    gamesObjects.forEach(function(snapshot){
      var gameKeys = snapshot.key()
      var playerKeys = snapshot;
      playerKeys.forEach(function(snapshot){
        if (snapshot.val().id == player.uid) {
          gamesToShow.push(gameKeys);
          console.log(gameKeys)
        }
      });
    });
  });
    for (var i=0;i<gamesToShow.length;i++) {
      var uniqueKeys = gamesToShow[i];
      if (game.$id == uniqueKeys) {
        return true;
      }
    };
  }

HTML 模板:

<h1>Dashboard</h1>
  <ul>
    <li class="hideGames" ng-repeat="game in games" ng-class="{showGames:displayGames(game)}">
      <a href="#" ng-click="gameDetails(game)">Course: {{ game.name }} <br> Date:{{ game.date }}<br></a>
      <a href="#" ng-click="removeDashboardGame(game)">Remove</a>
    </li>
  </ul>

如果我解析正确,您正在尝试获取当前用户正在玩的游戏列表。如果是这样,这段代码就可以解决问题:

var uid = 'simplelogin:19';
var gamesToShow = [];
ref.child('players').on('value', function(gamesSnapshot) {
  gamesSnapshot.forEach(function(gameSnapshot) {
    var playerKeys = Object.keys(gameSnapshot.val());
    playerKeys.forEach(function(playerKey) {
      var player = gameSnapshot.val()[playerKey];
      if (player.id === uid) {
        console.log(gameSnapshot.key());
        gamesToShow.push(gameSnapshot.val());
      }
    });
  });
  console.log(gamesToShow);
});

显示此代码有效的 JSBin:http://jsbin.com/selisa/edit?js,console

但这并不是说您的数据结构对于您要实现的目标而言非常糟糕。您正在遍历玩家以通过他们的密钥匹配他们,这使事情变得复杂。由于玩家有一个现有的自然键(他们的 uid)并且每个玩家可能只能加入每个游戏一次,所以最好将玩家存储在他们的 uid 下的游戏中:

{
  "-JwYx6ckhITt2GWOmzLy": {
      "simplelogin:19": true
  },
  "-Jwi64w0weox4vxIbz8J": {
      "simplelogin:19": true
  },
  "-Jwx-f7HnjIKdkMnM16D": {
      "simplelogin:22": true
  }
}

使用此数据结构,您可以简单地通过 Firebase 查询获取游戏列表:

ref.child('players')
   .orderByChild('simplelogin:19')
   .equalTo(true)
   .once('value', function(snapshot) { 
       console.log(snapshot.val()); 
   });

通常情况下,您可以根据您打算如何使用它来优化数据结构,从而避免许多令人头疼的问题。

您可能要考虑的另一种选择是将每个 player/user 的游戏存储在他们的 /users 节点下。这样你甚至不需要查询,但你可以直接访问游戏:

ref.child('users').child('simplelogin:19').child('games').once('value', ...

这将是性能最好的解决方案,因为它甚至不需要查询即可访问游戏。