【问题标题】:Meteor findOne query returns undefined in one template helper. In other template helpers, same query works wellMeteor findOne 查询在一个模板助手中返回未定义。在其他模板助手中,相同的查询效果很好
【发布时间】:2013-07-17 16:39:36
【问题描述】:

假设我有一个名为 GameStatus 的 Meteor 集合。我有不同角色的用户,但我为所有用户发布了 GameStatus 集合。我只是在 server/publications.coffee 中使用以下内容

Meteor.publish 'gamestatus', ->
    GameStatus.find()

对于两个角色(“S”和“B”),当我使用以下模板帮助程序(在文件 client/views/seller.coffee 和 中定义)时,我没有问题client/views/buyer.coffee)

currentRound: ->
    return GameStatus.findOne().currentRound

对于这些,我永远不会收到以下错误。

Uncaught TypeError: Cannot read property 'currentRound' of undefined 

但是对于另一个角色('admin'),使用相同的模板助手(在文件 client/views/admin.coffee 中定义)会给出上面显示的 Uncaught TypeError。如果我改写它会起作用:

currentRound: ->
    return GameStatus.findOne()?.currentRound

我有点理解为什么会这样。我认为,在加载页面时,该集合首先不可用,然后才可用。但是为什么上面显示的其他模板不会发生这种情况呢?

如果有人能帮助澄清这一点,我们将不胜感激。

【问题讨论】:

  • 当您订阅该集合时,在回调中将一些内容记录到控制台,以便您知道它何时可用,并对失败的调用执行相同的操作。这样你就可以检验你的假设了。
  • @MrD 你能举个例子吗?我应该记录什么可以帮助我知道订阅何时可用。似乎仅针对此特定角色,它们最初不可用。
  • 你想为你的订阅 gist.github.com/devonbarrett/b698c10cc427ee2c1811 做这样的事情,然后为 currentRound 函数记录类似的事情,看看它是否在集合准备好之前被触发

标签: javascript meteor


【解决方案1】:

我相信集合何时准备好并不总是一致的,所以如果你想覆盖所有的基础,总是为集合没有准备好的情况编写代码。

有一种处理未准备好的集合的快速而简单的方法,您可以在 todos 示例中找到更复杂的解决方案。

快速而肮脏的解决方案看起来像这样。

currentRound: ->
  gameStatusrecord = GameStatus.findOne();
  if(gameStatusRecord) 
    gameStatusRecord.currentRound

这会奏效。在集合准备好之前,currentRound 将返回 null,并且您的模板将短暂呈现并且可能只显示当前回合的空白。所以不是理想的用户体验,但也不是什么大不了的事。

对于更复杂的解决方案,您可以使用“就绪”功能检查您已订阅的集合是否已准备好进行查询。如果集合还没有准备好,你可以渲染一些其他的模板,比如“正在加载”,它保证在集合准备好之前不会调用 currentRound 助手。

例如,在 todos 示例中,客户端在 todos.js 的第 24 行订阅了“lists”集合:

var listsHandle = Meteor.subscribe('lists', function () {

然后在 todos.js 的第 80 行为列表模板定义一个辅助函数

Template.lists.loading = function () {
  return !listsHandle.ready();
};

然后在 todos.html 第 20 行的列表模板中,除非列表句柄准备好,否则它不会尝试渲染任何模板。

<h3>Todo Lists</h3>
{{#if loading}}
  <div id="lists">Loading...</div>
{{else}}
  <div id="lists">
    {{#each lists}}
    <!--etc.-->

【讨论】:

  • 感谢您的建议。
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 2014-11-27
  • 2013-02-18
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多