是否有可能即时创建新的Meteor系列?我想根据一些路径名来创建foo_bar
或bar_bar
,这个路径名应该是我想要的全局变量(所以我可以在整个应用程序中访问它)。
类似的东西:
var prefix = window.location.pathname.replace(/^\/([^\/]*).*$/, '$1');
var Bar = new Meteor.Collection(prefix+'_bar');
这里的问题是我应该从URL获取prefix
变量,因此如果我在if (Meteor.isClient)
之外声明它,我会收到错误:ReferenceError: window is not defined
。是否可以做这样的事情?
编辑:使用Akshats的第一次迭代回答我的项目js:http://pastie.org/6411287
答案 0 :(得分:4)
我不完全确定这会奏效:
你需要它分两部分,第一部分加载你之前设置的集合(在客户端和服务器上)
var collections = {};
var mysettings = new Meteor.Collection('settings') //use your settings
//Startup
Collectionlist = mysettings.find({type:'collection'});
Collectionlist.forEach(function(doc) {
collections[doc.name] = new Meteor.Collection(doc.name);
})'
您需要在服务器上添加一些集合:
Meteor.methods({
'create_server_col' : function(collectionname) {
mysettings.insert({type:'collection', name: collectionname});
newcollections[collectionname] = new Collection(collectionname);
return true;
}
});
您需要在客户端上创建它们:
//Create the collection:
Meteor.call('create_server_col', 'My New Collection Name', function(err,result) {
if(result) {
alert("Collection made");
}
else
{
console.log(err);
}
}
同样,这一切都是未经测试的,所以我只是试一试,希望它有效。
修改强>
也许下面应该可行,我已经添加了几个检查以查看该集合是否存在。在使用meteor reset
之前,请先运行var collections = {};
var mysettings = new Meteor.Collection('settings')
if (Meteor.isClient) {
Meteor.startup(function() {
Collectionlist = mysettings.find({type:'collection'});
Collectionlist.forEach(function(doc) {
eval("var "+doc.name+" = new Meteor.Collection("+doc.name+"));
});
});
Template.hello.greeting = function () {
return "Welcome to testColl.";
};
var collectionname=prompt("Enter a collection name to create:","collection name")
create_collection(collectionname);
function create_collection(name) {
Meteor.call('create_server_col', 'tempcoll', function(err,result) {
if(!err) {
if(result) {
//make sure name is safe
eval("var "+name+" = new Meteor.Collection('"+name+"'));
alert("Collection made");
console.log(result);
console.log(collections);
} else {
alert("This collection already exists");
}
}
else
{
alert("Error see console");
console.log(err);
}
});
}
}
if (Meteor.isServer) {
Meteor.startup(function () {
// code to run on server at startup
Collectionlist = mysettings.find({type:'collection'});
Collectionlist.forEach(function(doc) {
collections[doc.name] = new Meteor.Collection(doc.name);
});
});
Meteor.methods({
'create_server_col' : function(collectionname) {
if(!mysettings.findOne({type:'collection', name: collectionname})) {
mysettings.insert({type:'collection', name: collectionname});
collections[collectionname] = new Meteor.Collection(collectionname);
return true;
}
else
{
return false; //Collection already exists
}
}
});
}
对上面代码中的错误进行排序:
{{1}}
还要确保您的名字是javascript转义。
答案 1 :(得分:3)
事情变得容易多了:
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
db.createCollection("COLLECTION_NAME", (err, res) => {
console.log(res);
});
在您的服务器方法中运行它。