4

当我在服务器上定义我的流星集合并尝试在客户端访问它们而不是在任何流星提供的方法中时,rendered, events, created, helpers ...我总是收到一个错误,Meteor collection not defined如果我尝试在客户端中重新定义方法,我会得到Meteor collection already exists. 我可以通过在Meteor.startup()函数中引用我的定制集合来解决这个问题。我如何引用我在客户端的服务器上定义的集合。在流星文档中Meteor.Collection(),甚至可以在声明之前创建两个实例并进行订阅。

// okay to subscribe (and possibly receive data) before declaring
// the client collection that will hold it.  assume "allplayers"
// publishes data from **server's "players" collection.**
Meteor.subscribe("allplayers");
...
// client queues incoming players records until ...
...
Players = new Meteor.Collection("players");
4

1 回答 1

6

您可以将其放置Players = new Meteor.Collection("players");在文件的顶部,而无需将其放在Meteor.startup. 在启动之前确保它已定义Meteor.subscribe

例如,您的文件可能是:

Players = new Meteor.Collection("players");
MyCollection2 = new Meteor.Collection("MyCollection2");

Meteor.subscribe("allplayers");
Meteor.subscribe("mycollection2");

..rest of stuff

更简洁的方法可能是在项目的根目录中创建一个包含此文件的文件,以便在客户端和服务器上都使用它,而无需为每个文件重新定义它们,例如collection.js项目根目录中的 a 可能包含

Players = new Meteor.Collection("players");
MyCollection2 = new Meteor.Collection("MyCollection2");

if(Meteor.isClient) {
    Meteor.subscribe("allplayers");
    Meteor.subscribe("mycollection2");   
}

所以现在你不必在你的 or 上定义 orPlayers了。流星加载文件的方式将确保在您的其他常规文件之前定义它。如果您按照其他流星示例(派对和待办事项)中使用的,和格式排列文件,这可能效果最好MyCollection2/server/client/client/server/public

编辑:正如 BenjaminRH 建议的那样,将您的文件放入/lib/collections.js确保它甚至会在您的根项目目录中的其他文件之前加载。

于 2013-04-24T16:14:45.577 回答