0

我在使用 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 个小时了,还是搞不明白

4

1 回答 1

0

首先,我认为 for 的回调to不是响应式的,因此尽管 sub 的ready()方法是响应式的,但to回调不会重新运行。

其次,始终在您的发布中返回一个游标:

Meteor.publish('singleChannel', function(id) {
    return /*id &&*/ Channels.find(id);
});

最后,使用 Iron Router —— 这正是您所追求的(参见 参考资料waitOn

于 2013-10-11T14:47:02.723 回答