在没有流星启动的情况下在客户端上提供集合

War*_*arz 4 javascript meteor

当我在服务器上定义我的流星集合并试图在客户端访问它们而不是在任何流星提供的方法中时,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");
Run Code Online (Sandbox Code Playgroud)

Aks*_*hat 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
Run Code Online (Sandbox Code Playgroud)

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

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

if(Meteor.isClient) {
    Meteor.subscribe("allplayers");
    Meteor.subscribe("mycollection2");   
}
Run Code Online (Sandbox Code Playgroud)

所以现在你不必定义PlayersMyCollection2在你/server或之后/client.流星加载文件的方式将确保在其他常规文件之前定义它.如果你已经安排在你的文件,这可能效果最好/client,/server/public格式在其他流星的例子是使用(双方和待办事项)

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

  • 我通常将我的集合放在`/ lib/collections.js`,`/ lib`文件夹中,确保它在`/ client`或`/ server`之前加载. (7认同)