我需要在另一个集合中继续进行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中也行不通。有人有线索吗?
答案 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}}