meteor.js使用aldeed:表格与RemoteCollectionDriver

时间:2015-04-16 05:28:20

标签: javascript meteor

我在尝试将数据从集合填充到meteor的aldeed:tabular模块时遇到问题。

我的代码看起来像这样,并且是作为common.js文件的项目的根 以下所有代码都在一个文件中: 根/ LIB / hello.js

if (Meteor.isServer) {
    Meteor.startup(function () {
    // code to run on server at startup

          database = new MongoInternals.RemoteCollectionDriver("mongodb://localhost:27017/mydb");
          idpool = new Mongo.Collection("idpool", {_driver:database});

        Meteor.publish('idpool', function(){
            return idpool.find();
        });

    });
}

if (Meteor.isClient) {

    Meteor.subscribe("idpool");
}


TabularTables = {};

Meteor.isClient && Template.registerHelper('TabularTables', TabularTables);

TabularTables.idpool = new Tabular.Table({
    name: "idpool",
    collection: idpool,
    columns: [
        {data: "_id", title: "id"}
    ]
});

表格代码必须是服务器和客户端可见的公共代码,但是当我运行上面的“idpool”集合时,没有定义(超出范围)。

Reference Error: idpool is not defined

将范围外的数据库声明移到JS的顶部,然后我无法发布和订阅它。即:

database = new MongoInternals.RemoteCollectionDriver("mongodb://localhost:27017/adaptiveid");
idpool = new Mongo.Collection("idpool", {_driver:database});
//rest of the code.....

如果我尝试通过代码的常见表格部分添加第二次,如下所示:

idpool = new Mongo.Collection("idpool");

我收到以下错误:

  

错误:已定义名为'/ idpool / insert'的方法

我在这里做错了什么?如何声明数据库服务器端并将其公开给公共表格代码。

3 个答案:

答案 0 :(得分:1)

您应该将代码放在/ lib文件夹

  /lib
  if(Meteor.isServer){
       database = new        MongoInternals.RemoteCollectionDriver("mongodb://localhost:27017/adaptiveid");
      idpool = new       Mongo.Collection("idpool",   {_driver:database});
      //rest of the code.....
   }

为什么是isServer和/ lib?那么/ lib文件夹是开始时的第一个流量加载,但是该代码在客户端/服务器之间共享,这就是为什么你应该指定它只在服务器中使用该代码

注意 Error: A method named '/idpool/insert' is already defined来到这里是因为您要声明集合idpool两次。

idpool = new Mongo.Collection("idpool", {_driver:database})

您已经在那里声明了这个集合,为什么要声明它两次?,只需删除第二个idpoll = new Mongo.Collection('idpool')

答案 1 :(得分:0)

我也陷入困境,文档只是简单地说“用通用代码定义你的表” - 这一切都非常正确,但同样重要的是服务器和客户端都必须能够访问你的集合。

所以我发现,在一个文件中定义我的所有集合,创建一个'lib / collections.js',对我来说效果很好,所以我知道它们是存在的,当我重构时,我没有忘记它们何时出现,所以我会有类似的东西:

export const idpoll = new Mongo.Collection('idpool');
export const otherCollection = new Mongo.Colletionc('myOtherCollectin');

然后在我的代码中的任何其他地方,如果我需要该集合,我只是导入它:

import { idpoll } from './lib/collections.js'  //ie. path to collections.js

在我的项目中我有多个表,因此我决定创建一个lib / init-tables.js文件

export let TabularTables = {};
Meteor.isClient && Template.registerHelper('TabularTables',TabularTables);

然后对于每个表我都有一个lib / myNameTable.js文件以及初始设置。

import { TabularTables } from './init-tables.js';  // Import TabularTables helper
import { idpoll } from './collections.js';

TabularTables.Regs = new Tabular.Table({
  name: 'IDPOL',
  collection: idpol,
  columns: [
    {data: 'field', title: 'fieldtitle'},line'},

   ...

  ]
});

答案 2 :(得分:-1)

我确定它的标准做法是在lib文件夹中声明新的集合,以便在其余代码运行之前创建它们 将idpool行移动到lib并重试