1

我在这里有一个用流星写的简单应用程序:https ://gist.github.com/drew-gross/6202629有问题。调用该Template.tab.ordered_drinks函数时,没有找到任何选项卡(Tabs.find({}).fetch()返回一个空数组),但只​​有大多数时间。有时标签在那里。我检查了它们是否存在于数据库中。

重现:

1) 运行应用程序。(需要流星路由器)

2)在控制台上创建一个选项卡:Tabs.insert({owner:"foo"})

3)尝试查看选项卡的页面:localhost:3000/tabs/:id

该页面将工作或不工作,似乎是随机的。要确认,您可以在 .js 的第 9 行或第 19 行设置断点并执行此操作Tabs.find({}).fetch(),您有时会看到有时看不到选项卡。

这有点像 Meteor 中的一个错误,但我想我会先检查一下我是否做错了什么。

浏览器:Chrome 28 Meteor 版本:Release 0.6.4.1 节点版本:v0.10.15

4

1 回答 1

1

如果订阅尚未获得数据,似乎可能会出现问题。

在流星中,html/js 被发送到客户端,然后呈现页面。同时客户端通过 websockets/long polling 连接到服务器以检索 mongo 数据库。

因此,有时您可以在数据库中没有任何内容的情况下呈现 html。

您只需要注意在数据到达时使用反应性来处理,而不是假定它已经存在,如下所示:

Template.tab.ordered_drinks = function () {
    return Tabs.findOne(Session.get('tabId')).ordered_drinks;
};

如果Tabs.findOne(Session.get('tabId'))null因为客户端上还没有任何数据(尚未).ordered_drinks,那么您将在 chrome 控制台上收到错误消息,有时会看到/有时看不到选项卡,具体取决于数据库是否已加载。

尝试更改下面的行以允许Tabs.findOne(Session.get('tabId'))null不引发错误的情况下。

Template.tab.ordered_drinks = function () {
    var tab = Tabs.findOne(Session.get('tabId'));
    return tab && tab.ordered_drinks;
};

所以此时它正在加载。一旦数据到达,它就会反应性地使用选项卡重新渲染这部分。

于 2013-08-11T00:54:55.090 回答