2013-05-19 26 views
1

我有两个类别,对于一些objectsparents动态汽提从它们的字段的对象在流星

Objects = new Meteor.Collection('objects'); 
Parents = new Meteor.Collection('parents'); 

的对象包含的某些字段,并且是指一个父对象,例如:

Objects.insert({ name: "o1", parent: "p1", f1: "val1", f2: "val2", f3: "val3" }); 
Objects.insert({ name: "o2", parent: "p2", f1: "val4", f2: "val5", f3: "val6" }); 

父母定义哪个字段可以发送给客户端,例如:

Parents.insert({ name: "p1", allowedFields: [ "name", "f1", "f2" ] }); 
Parents.insert({ name: "p2", allowedFields: [ "name", "f1", "f3" ] }); 

我想发布/订阅所有对象,但接收它们的不允许的字段被剥夺。

根据上面的例子中,我希望在客户端上执行以下操作:

​​

我怎样才能有效地做到这一点?

语境:

  • 流星
  • 我通常会有100 parents和1000 objects
  • 我不提前多少人知道parents/objects我都会有,不知道是什么允许的字段将由每个参考parent

回答

2

执行以下操作...

在服务器上:

Meteor.publish('objects', function(parentName) { 
    var parent = Parents.findOne({'name': parentName}); 
    var allowedFields = {}; 
    for (var i = 0; i < parent.allowedFields; i++) 
     allowedFields[parent.allowedFields[i]] = 1; 
    return Objects.find({ parent: parentId}, { fields: allowedFields }); 
}); 

在客户端:

Parents.find({}).foreach(function(parent) { 
    Meteor.subscribe('objects', parent.name); 
}); 
0

您可以使用field specifiers来限制从服务器传递到客户端的字段。这应该是最简单的方法。

例如:

Objects.find({}, 
    {fields: {name:1, f1:1, f2:1}}); 

在这种情况下,字段线允许“名称”,“F1”,和“F2”字段被传递-到客户端。