Meteor 在另一个集合中使用 collection.find()

Meteor using a collection.find() in another collection

我需要在另一个集合中进行 collection.find()。我有一个名为 Orders 的集合。

Orders = new Mongo.Collection('orders')
Orders.attachSchema(new SimpleSchema({
clientId: {
    type: String
  },
  orderDate: {
    type: Date
  }
});

它使用 aldeed:collection2 和 aldeed:simple shema。我用它来创建一个使用 aldeed:autoform

的表单

我想在包含客户端 ID 的 ClientId 字段中放置一个 allowedValues。 所以我需要使用 Clients.find() 获取所有客户端 ID。客户是另一个集合。但是在客户端,如果我尝试将 console.log(Clients.find().fetch()) 放入我的 order.js 集合文件中,它会记录一个空数组,而在服务器上它会记录一个数组包含我所有的客户。我理解在客户端可以使用集合之前调用该函数。但即使将它包装在 Meteor.startup 中也不起作用。有人知道吗?

我猜你想做的是在 Order 编辑器中限制客户端的选择。您可以像下面这样创建一个助手

Template.editOrder.helpers
   clientList: ()->
     Client.find().fetch()

并将此助手与自动表单一起使用

{{> afQuickField name="clientSelected" options=clientList}}

实际上,将所有这些放在一起非常棘手,因为我还需要在客户端验证该字段。所以我使用了 Ryan 展示的解决方案,但需要添加一些东西:

var ordersShema = {
clientId: {
    type: String,
    allowedValues: clientsId
  },..
}

Orders.attachSchema(new SimpleSchema(ordersShema));

clientsId 是从 Clients 集合中动态上传的 ID。 但这在服务器端没问题,但在客户端,clientsId 仍然是空的,无法进行验证。所以我不得不在客户端添加这段代码:

Tracker.autorun(function () {
  Orders._c2._simpleSchema._schema.clientId.allowedValues = Labelizer.allowedValues(Clients.find(),'_id');
});

(Labelizer 只是一个从游标创建 allowedValues 的函数)。

当然,选项是通过助手生成的。

Template.ordersAdd.helpers({
  clientsList:function(){
    return Labelizer.options(Clients.find(),'_id',['name','surname'],' ');
  },...
}

所以这个领域与这个助手一起工作得很好:

{{> afQuickField name='clientId' options=clientsList}}