选择活动的流星订阅

时间:2014-07-12 06:05:31

标签: javascript meteor

我正在阅读“探索流星”一书,我遇到了一个我无法调和的问题。我的问题是,Meteor如何知道如何激活要订阅的出版物?

这是我的publications.js服务器端

Meteor.publish('posts', function(limit){
    return Posts.find({}, {sort: {submitted: -1}, limit: limit});
});

Meteor.publish('newPosts', function(limit) {
  return Posts.find({}, {sort: {submitted: -1}, limit: limit});
});

Meteor.publish('bestPosts', function(limit) {
  return Posts.find({}, {sort: {votes: -1, submitted: -1}, limit: limit});
});

Meteor.publish('singlePost', function(id) {
  return id && Posts.find(id);
});


Meteor.publish('comments', function(postId) {
  return Comments.find({postId: postId});
});

Meteor.publish('notifications', function() {
  return Notifications.find({userId: this.userId});
});

然后订阅位于main.js

newPostsHandle = Meteor.subscribeWithPagination('newPosts', 10);
bestPostsHandle = Meteor.subscribeWithPagination('bestPosts', 10);

postHandle = Meteor.subscribeWithPagination('posts', 10);

Deps.autorun(function() {  
  Meteor.subscribe('comments', Session.get('currentPostId'));
})

Meteor.subscribe('notifications');

那么流星如何知道哪些订阅是必要的?无论我在应用程序中的哪个位置,我都订阅了每个订阅吗?我认为路由器正在运行,但我不知道我是否清楚地看到路由器正在做什么来管理订阅?

1 个答案:

答案 0 :(得分:0)

Meteor激活您告诉它的订阅。订阅如下:

Meteor.subscribe('posts');

一旦客户端开始运行,就会订阅posts,并始终保持订阅打开。另一方面,如果您有autorun之类的话:

Tracker.autorun(function() {
  Meteor.subscribe('comments', Session.get('currentPostId'));
});

订阅将在客户端启动时再次激活,但只要更新currentPostId会话变量,它就会重新运行。请注意,常见的习惯用法是在用户登录后立即启动某些订阅。例如:

Tracker.autorun(function() {
  if (Meteor.userId())
    Meteor.subscribe('friends');
});

在上述所有情况中,订阅都会独立于用户在应用中的位置而激活。使用iron-router的waitOn挂钩来激活与当前路由相关的订阅是非常常见的。例如:

Router.map(function () {
  this.route('dashboard', {
    waitOn: function () {
      return Meteor.subscribe('news');
    }
  });
});

每当用户导航到dashboard路线时,他也会订阅news。当他离开时,订阅将停止(有一些警告),新的订阅将根据路由器的配置方式启动。旁注:Subscriptions Manager是一个有趣的优化,可以解决在路线之间导航时不断启动和停止订阅的问题。

最后,我要注意,混合使用全局和特定于路由的订阅是完全合理的。根据您的应用,随意混合搭配。