初学流星:模板和findOne

时间:2012-05-01 16:02:59

标签: handlebars.js meteor

我想尝试Meteor,所以我说在coffeescript中开发一个小型的多房间聊天应用程序。 我有问题使用把手将findOne的结果传递给html页面。

if Meteor.is_client
  room=Rooms.findOne({id:1})
  Template.room({room_name:room.name})

在html页面中

 <head>
  <title>Chat!</title>
 </head>
 <body>
   {{> room}}
 </body>

<template name="room">
 Welcome to {{room_name}}
</template>

现在,鉴于id = 1的会议室文档名称='Room1',我希望该页面呈现'欢迎来到Room1',但得到一个白页,控制台显示2个错误:

Uncaught TypeError: Cannot read property 'name' of undefined
Uncaught TypeError: Cannot read property 'room_name' of undefined

显然房间未定义,即使该文件确实存在。

2 个答案:

答案 0 :(得分:11)

在客户端数据库缓存有时间同步到服务器之前,它在一瞬间未定义。一旦客户端同步,模板应该再次渲染,但是因为它在第一次不会发生时抛出错误(我最近对类似的问题感到困惑)。

尝试此操作(使用短路&&来测试该房间是否存在):

if Meteor.is_client
    Template.room.room_name = ->
        room = Rooms.findOne({id:1})
        room && room.name

注意:我将findOne调用移动到函数中以确保在更新发生时调用它,但是在你拥有它的时候也可能没问题

答案 1 :(得分:4)

由于你正在使用Coffeescript,存在运算符'?'也可以工作:

Template.room.helpers
    room_name: -> Rooms.findOne(id: 1)?.name