Javascript Meteor 1.4,如何访问包中的用户定义集合
背景: 所以我正在用react为meteor 1.4.2创建一个管理包,这样我就可以学习如何做这类事情。管理包将只能够更新用户定义的集合(插入、删除、修改) 我在我的应用程序中的Javascript Meteor 1.4,如何访问包中的用户定义集合,javascript,meteor,package,Javascript,Meteor,Package,背景: 所以我正在用react为meteor 1.4.2创建一个管理包,这样我就可以学习如何做这类事情。管理包将只能够更新用户定义的集合(插入、删除、修改) 我在我的应用程序中的imports/api/posts.js下有这个文件: // imports/api/posts.js import { Meteor } from 'meteor/meteor'; import { Mongo } from 'meteor/mongo'; export const Posts = new Mongo
imports/api/posts.js
下有这个文件:
// imports/api/posts.js
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
export const Posts = new Mongo.Collection('posts');
if (Meteor.isServer) {
Meteor.publish('posts', function postsPublication() {
return Posts.find();
});
}
我可以在我的应用程序中轻松访问这个文件,例如使用“../imports/api/Posts.js”中的import{Posts}代码>
问题:
如何从管理包中访问相同的Posts
集合,以便插入新项目、删除项目等
另外,我之前也看到过类似的事情,但这是否意味着诸如meteor之类的包也不能与模块系统一起工作?理解这一点的关键是认识到,有些meteor包是库,有些是(meteor)框架的扩展
yogiben:admin
是Meteor框架的扩展,它需要能够找到您编写的代码(您的集合)才能正常工作
如何实现这一点取决于您。以前的集合是全局定义的,因此可以(自动/急切地)导入它们,并且通常位于/client
或/server
目录之外,以便可以在客户端和服务器上访问它们
现在您可以选择-,或者在管理框架需要的地方导入它们。作为第三种方式,您可以要求将它们附加到(服务器端)global
对象,例如作为dict(即global.myCollections={'posts':posts}
),以及(在浏览器中)窗口
对象(使用window.myCollections={'posts':posts}
)
yogiben:admin
将所有内容都保留在/imports
之外,但是我怀疑,如果您只是将集合定义保留在/imports
之外,将其余代码移到应用程序中,那么这仍然可以正常工作。我不认为Meteor有办法在应用程序内部定义所有集合
为了实现这一点,您可以重写Mongo.Collection方法,以保留对每个已创建集合的引用
const _oldCollection = Mongo.Collection;
Mongo.Collection = function(name, options) {
const c = new _oldCollection(name, options);
Meteor.myCollections[name] = c;
return c;
};
然后将其用作:
// define new collection
new Mongo.Collection('questions');
// retrieve collection
const c = Meteor.myCollections['questions'];
在使用它定义新集合之前,请确保加载了用于覆盖Mongo.Collection
的代码。回答得好,感谢您提供了库与框架的链接-对于meteor软件包,我并没有考虑到这一点。我认为根据您的建议,最干净的解决方案是在/imports
之外定义集合-我将尝试一下。
const _oldCollection = Mongo.Collection;
Mongo.Collection = function(name, options) {
const c = new _oldCollection(name, options);
Meteor.myCollections[name] = c;
return c;
};