流星FindOne结果

时间:2014-05-28 20:38:58

标签: javascript meteor

我在访问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个问题。

  1. notInGame总是返回true,因为alert(player.gameId)打印未定义,所以我假设这不是你从FindOne()结果引用字段的方式。

  2. 每次我尝试添加模板名称=&#34; playerName&#34;即使我只在模板中放置静态html,页面也不会加载。我特意命名了这个playerName,因为我已经有一个玩家模板,它对不同的同一个对象起作用。只是为了踢,我改为&gt;玩家也失败了。

3 个答案:

答案 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()。否则,您将获得光标,而不是您想要的真实对象。