3

我需要在另一个集合中进行 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 中也不起作用。有人有线索吗?

4

2 回答 2

1

我猜你想要做的是限制Order编辑器中客户端的选择。您可以创建一个帮助程序,如下所示

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

并将此助手与 autoform 一起使用

{{> afQuickField name="clientSelected" options=clientList}}
于 2015-12-14T21:41:35.317 回答
0

实际上,将所有这些放在一起非常棘手,因为我还需要在客户端验证该字段。所以我使用了 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}}
于 2015-12-16T12:30:19.267 回答