我在访问javascript中的Meteor Collections findOne结果字段时遇到问题。我很清楚你可以使用一个模板来打印每个字段,但是在渲染if的内部之前我需要在javascript中为我的函数。请参阅下文。
的javascript:
Players = new Meteor.Collection("players");
Template.gameLobby.notInGame = function() {
var player = Players.findOne(Session.get("playerId"));
alert(player.gameId);
if (Session.equals("lobbyGame", player.gameId)) {
return true;
}
return false;
}
Template.gameLobby.showGamePlayers = function (){
var id = Session.get("lobbyGame")
return Players.find({gameId: id});
}
HTML:
<template name="gameLobby">
{{#each showGamePlayers}}
{{> playerName}}
{{/each}}
{{#if notInGame}}
<input class="join" value="Join Game">
{{else}}
Waiting for players
{{/if}}
</template>
我遇到的2个问题。
notInGame总是返回true,因为alert(player.gameId)打印未定义,所以我假设这不是你从FindOne()结果引用字段的方式。
每次我尝试添加模板名称=&#34; playerName&#34;即使我只在模板中放置静态html,页面也不会加载。我特意命名了这个playerName,因为我已经有一个玩家模板,它对不同的同一个对象起作用。只是为了踢,我改为&gt;玩家也失败了。
答案 0 :(得分:0)
您是否正在使用Meteor MongoDB的自动_id分配作为 playerId 会话中的值?
如果是这样,您应该使用player._id
来检索该值:
Template.gameLobby.notInGame = function() {
var player = Players.findOne(Session.get("playerId"));
alert(player._id);
if (Session.equals("lobbyGame", player._id)) {
return true;
}
return false;
}
答案 1 :(得分:0)
感谢您的帮助,我找到了解决方案。系统中没有任何玩家在那里有一个gameId,因此一旦我运行了Players.Insert({name: "fakePlayer", gameId:"fakeId"});
一切正常,这个字段根据MongoDB是不存在的。
答案 2 :(得分:-1)
我认为你应该在findOne()之后添加一个.fetch()。否则,您将获得光标,而不是您想要的真实对象。