我在这里用流星写的一个简单的应用程序:https://gist.github.com/drew-gross/6202629有问题。调用Template.tab.ordered_drinks
函数时,未找到任何选项卡(Tabs.find({}).fetch()
返回空数组)但仅在大多数情况下。有时Tabs在那里。我已经检查过它们是否存在于数据库中。
重现:
1)运行应用程序。 (需要流星路由器)
2)在控制台上创建一个标签:Tabs.insert({owner:"foo"})
3)尝试查看标签页:localhost:3000/tabs/:id
页面可以正常工作,看似随意。要确认,您可以在.js的第9行或第19行设置断点并执行Tabs.find({}).fetch()
,有时您会看到并且有时看不到标签。
这有点似乎是Meteor中的一个错误,但我想我会首先检查一下我是否可能做错了。
浏览器:Chrome 28 流星版:发布0.6.4.1 节点版本:v0.10.15
答案 0 :(得分:1)
如果订阅尚未获得数据,则可能会出现问题。
在meteor中,html / js被发送到客户端,然后呈现页面。同时客户端通过websockets / long轮询连接到服务器以检索mongo数据库。
因此,有时您可以在数据库中没有任何内容的情况下呈现html。
你只需要小心你在数据到达时使用反应来处理,而不是假设它已经在那里,就像这里:
Template.tab.ordered_drinks = function () {
return Tabs.findOne(Session.get('tabId')).ordered_drinks;
};
如果Tabs.findOne(Session.get('tabId'))
是null
,因为客户端上还没有任何数据,那么.ordered_drinks
就不存在了,你会在chrome console&有时看/有时看不到标签,取决于数据库是否已加载。
尝试更改下面的行以允许Tabs.findOne(Session.get('tabId'))
为null
而不会抛出错误。
Template.tab.ordered_drinks = function () {
var tab = Tabs.findOne(Session.get('tabId'));
return tab && tab.ordered_drinks;
};
所以此时正在加载。一旦数据到达,它将立即用标签重新呈现此部分。