我在使用 Meteor 和 Meteor Router 时遇到了一些疯狂的问题,特别是ready
是 Meteor 订阅句柄的回调及其与路由器的相互作用。如果我通过 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 个小时了,还是搞不明白