Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor 1.4,如何访问包中的用户定义集合_Javascript_Meteor_Package - Fatal编程技术网

Javascript Meteor 1.4,如何访问包中的用户定义集合

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

背景:

所以我正在用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.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;
};