我遇到了Meteor和流星路由器的一些疯狂问题,特别是Meteor订阅句柄的ready
回调及其与路由器的相互作用。如果我通过ID调用它是完美的,如果我通过'slug'调用它它不起作用。
我在服务器上有两个出版物:
Meteor.publish('singleChannel', function(id) {
return id && Channels.find(id);
});
Meteor.publish('singleChannelSlug', function(_slug) {
return Channels.find({slug:_slug});
});
在client/main.js
我有两个订阅的出版物:
singleChannelSlugHandle = Meteor.subscribe('singleChannelSlug', Session.get('currentChannelSlug'), function () {
console.log('singleChannelSlug is ready() ');
});
singleChannelIdHandle = Meteor.subscribe('singleChannel', Session.get('currentChannelId'),function () {
console.log('singleChannelIdHandle ready');
});
我在路由器中的:
Meteor.Router.add({
'/channel/:slug': {
as:'channelPage',
to: function () {
console.log('route1');
if (singleChannelSlugHandle.ready()) {
console.log( 'ready();', Channels.findOne({slug:Session.get('currentChannelSlug')}) );
Session.set('currentChannelId', Channels.findOne({slug:Session.get('currentChannelSlug')})._id );
return 'channelPage';
} else {
return 'spinner';
};
},
and: function(slug) {
Session.set('currentChannelSlug', slug);
}
}
});
这是console.log()输出:
route1
singleChannelIdHandle ready
singleChannelSlug is ready()
现在应该发生的是,只要singleChannelSlugHandle
准备就绪,它就会获取_id并将其写入Session并导航到该页面。但无论出于何种原因,它都无法奏效console.log('ready();')永远不会被调用。
奇怪的是,如果我更改文件并保存,它会工作一次。如果我使用ID重写路由它也可以工作,但我需要它来使用slug,因为我需要比一些抽象ID更漂亮的url。我现在已经待了4-5个小时了,无法弄清楚
答案 0 :(得分:0)
首先,我不认为to
的回调是被动的,所以尽管子ready()
方法被动,但to
回调不会重新运行。
其次,总是在你的发布中返回一个光标:
Meteor.publish('singleChannel', function(id) {
return /*id &&*/ Channels.find(id);
});
最后,使用铁路由器 - 它正是你所追求的(见waitOn
)