这个问题建立在前一个问题的基础上(见here)。
使用此代码设置动态订阅(稍微修改了上一个问题):
Meteor.startup(function(){
Meteor.subscribe('parents');
Deps.autorun(function() {
parent = Parents.findOne({ _id: Session.get('parentId') });
if (!parent) return;
Meteor.subscribe('kids', parent);
});
});
问题是服务器端必须信任客户端传递的parent
对象。理想情况下,人们只想传递父对象的_id
,如下所示:
Deps.autorun(function() {
parentId = Session.get('parentId');
if (!parentId) return;
Meteor.subscribe('kids', parentId);
});
但是,在这种情况下,动态订阅行为会中断(例如,更新父项的子数组时,客户端上的kids
集合不会更新。)
为什么Session.get('parentId')
的反应性低于Parents.findOne({ _id: Session.get('parentId') })
,或者与Meteor.subscribe('kids', parent)
与Meteor.subscribe('kids', parentId)
有关?
编码此权利的最佳模式是什么?
答案 0 :(得分:0)
您想要做的事情似乎如下:
Deps.autorun(function() {
parent = Parents.findOne({ _id: Session.get('parentId') }, {fields: {_id: 1}});
if (!parent) return;
Meteor.subscribe('kids', parent._id);
});
然而,这仍然不完全安全;它只是检查Parents
集合以确保在尝试订阅它之前存在引用的Session变量 - 这取决于parents
订阅。如果您希望它得到妥善保护,您将不希望任何父母通过parent
订阅客户端,如果客户端无法看到它们。