我无法配置路由的waitOn
部分,其中一个订阅参数由来自其他订阅的文档中的值确定。
游戏中的收藏品是候选人和访谈。面试将只有一名候选人。以下是一些示例数据:
candidate = {
_id: 1
firstName: 'Some',
lastName: 'Developer'
//other props
};
interview = {
_id: 1,
candidateId: 1
//other props
};
路由配置如下。
this.route('conductInterview', {
path: '/interviews/:_id/conduct', //:_id is the interviewId
waitOn: function () {
return [
Meteor.subscribe('allUsers'),
Meteor.subscribe('singleInterview', this.params._id),
// don't know the candidateId to lookup because it's stored
// in the interview doc
Meteor.subscribe('singleCandidate', ???),
Meteor.subscribe('questions'),
Meteor.subscribe('allUsers')
];
},
data: function () {
var interview = Interviews.findOne(this.params._id);
return {
interview: interview,
candidate: Candidates.findOne(interview.candidateId);
};
}
});
问题是我没有候选人传递给singleCandidate
方法中的waitOn
订阅,因为它存储在面试文档中。
我想过两种可能的解决方案,但我真的不喜欢它们中的任何一种。首先是将路线更改为/interviews/:_id/:candidateId/conduct
。第二种是对数据进行非规范化,并将候选人的信息存储在访谈文档中。
除了这两个之外,还有其他选择吗?
答案 0 :(得分:5)
您可以通过阅读有关反应联接的this post来获得一些想法。因为您需要将候选人作为路线数据的一部分来获取,所以最简单的方法似乎就是同时发布面试和候选人:
Meteor.publish('interviewAndCandidate', function(interviewId) {
check(interviewId, String);
var interviewCursor = Interviews.find(interviewId);
var candidateId = interviewCursor.fetch()[0].candidateId;
return [interviewCursor, Candidates.find(candidateId);];
});
但是,此加入不是被动的。如果将不同的候选人分配给面试,则不会更新客户。我怀疑在这种情况下这不是问题。
答案 1 :(得分:2)
您可以更改您的发布功能单个候选人将interviewId作为参数而不是候选人ID并传递给此.params._id
答案 2 :(得分:2)
我有类似的问题,我设法通过订阅
中的回调来解决它http://docs.meteor.com/#/basic/Meteor-subscribe
例如,您拥有包含城市ID的用户数据,并且您需要获取城市对象
waitOn: ->
router = @
[
Meteor.subscribe("currentUserData", () ->
user = Meteor.user()
return unless user
cityIds = user.cityIds
router.wait( Meteor.subscribe("cities", cityIds)) if cityIds
)
]