Have a look at the last comments on this issue. Chris explains that the subscriptions initiated by your router will be stopped once you navigate away from the route that activated them. This means that changing routes causes your subscriptions to continually start and stop, which explains the behavior you are seeing. Here are some options:
Start the subscription outside of the router
Putting subscriptions into your router has the benefit of delaying the subscription until it's needed. But you also pay the penalty of having not having the data before the route is run. Consider activating some of your subscriptions outside of the router like so:
Tracker.autorun(function() {
if (Meteor.user()) {
Meteor.subscribe('posts');
}
});
Don't wait on the subscription
You could add your subscriptions to your route's before
hook. See the example here. You get the benefit of subscribing when you need the data but not having to wait. The downside is that you'll probably need to add some guards to your code to protect against your data not being loaded yet.
Use a subscription manager
Have at look at subs-manager (documentation here). It's a package built to help with this exact problem. We use it in production and it really helps increase our subscription reuse between routes. One word of advice - the cacheLimit
and expireIn
have pretty conservative defaults, so if you have a lot of shared subscriptions you should consider increasing these.