访问推入数组的项目
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', ...
这将是性能最好的解决方案,因为它甚至不需要查询即可访问游戏。
在我的 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', ...
这将是性能最好的解决方案,因为它甚至不需要查询即可访问游戏。