Meteor と Meteor Router、特にready
Meteor サブスクリプション ハンドルのコールバックと Router との相互作用に問題があります。サブスクリプションを ID で呼び出すと完全に機能しますが、「スラッグ」で呼び出すと機能しません。
サーバー上に 2 つのパブリケーションがあります。
Meteor.publish('singleChannel', function(id) {
return id && Channels.find(id);
});
Meteor.publish('singleChannelSlug', function(_slug) {
return Channels.find({slug:_slug});
});
client/main.js
パブリケーション用に 2 つのサブスクリプションがあります。
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 を取得してセッションに書き込み、ページに移動します。しかし、何らかの理由でそれが機能することはありません。console.log('ready();') は呼び出されません。
奇妙なことに、ファイルを変更して保存すると、一度は機能します。ID だけを使用してルートを書き直しても機能しますが、抽象的な ID よりもきれいな URL が必要なため、スラッグを操作するにはそれが必要です。私はこれを4〜5時間続けていますが、理解できません