Meteor在另一个集合

时间:2015-12-14 18:20:05

标签: meteor meteor-autoform meteor-collection2 simple-schema

我需要在另一个集合中继续进行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

的表单

我想在ClientId字段中放置一个包含客户端ID的allowedValues。 因此,我需要使用Clients.find()获取所有客户端ID。客户是另一个集合。但是在客户端上,如果我尝试在我的order.js集合文件中放入console.log(Clients.find(。。fetch()),它会记录一个空数组,而在服务器上它会记录一个包含所有客户端的数组。我发现在客户端提供集合之前,已对函数进行了调用。但即使将它包装在Meteor.startup中也行不通。有人有线索吗?

2 个答案:

答案 0 :(得分:1)

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

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

将此助手与autoform一起使用

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

答案 1 :(得分:0)

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

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

Orders.attachSchema(new SimpleSchema(ordersShema));

使用clientsId,这些ID是从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}}