javascript - Meteor findOne 查询在一个模板助手中返回未定义。在其他模板助手中,相同的查询效果很好

标签 javascript meteor

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

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

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

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

对于这些,我从未收到以下错误。

Uncaught TypeError: Cannot read property 'currentRound' of undefined 

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

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

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

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

最佳答案

我相信集合准备就绪的确切时间并不总是一致的,因此如果您想涵盖所有基础,请始终针对集合未准备好的情况进行编码。

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

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

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

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

对于更复杂的解决方案,您可以使用“就绪”函数检查您订阅的集合是否已准备好供查询。如果一个集合还没有准备好,你可以渲染一些其他的模板,比如“loading”,这保证了在集合准备好之前不会调用 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 行的列表模板中,它不会尝试呈现任何模板,除非 listsHandle 准备就绪。

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

关于javascript - Meteor findOne 查询在一个模板助手中返回未定义。在其他模板助手中,相同的查询效果很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17728386/

相关文章:

google-chrome - 是否有针对 Chrome 或 Firefox 的 DDP 请求监控工具?

mongodb - 将数据发布到 Meteor 的 MongoDB 集合

javascript - ES6 过滤器 - 如何返回对象而不是数组?

javascript - 为什么调用google map api后需要写alert()

javascript - 本地时间格式的 UTC 日期时间

javascript - 如果页面有重定向,则 window.load 不起作用

javascript - 可以使用 JQuery 让文本在加载时淡出,无法让文本在点击时淡出

javascript - 从模板助手meteor/mongodb访问minimongo

angularjs - meteor Angular 教程 : Todos List's <todos-list></todos-list> tag

meteor - MeteorJS 的基本问题