如何刷新 Meteor.Router 订阅的数据?

How to refresh data from Meteor.Router subscription?

我一直在使用 Meteor.js 制作一个简单的博客网站。在索引中,页面显示最近的 posts 并且列表可以根据它们的标签和类别重新排列。它也(当然)每个 post.

都有单独的页面

刷新索引时,列表排序良好,按publishedAt排序。当我尝试按标签或类别排列 post 时,甚至当我去见一个人时 post,这很好。但是当我返回索引时,最后获取的 posts(或后一种情况下的 post)总是在列表的顶部,没有按 publishedAt 正确排序。

例如,假设我们有 4-3-2-1 的列表。通过对它们进行排序,我有 3-2 个。当我回到索引时,现在列表变成了 3-2-4-1。

当我从 client.js console.log() 时,首先记录最后获取的 post,然后记录其他 post,包括已记录的。如何获取 posts 而不受之前获取数据的影响?

client.js

Posts = new Mongo.Collection("posts");

Router.route('/', {
  name: 'index',
  template: 'index',
  layoutTemplate: 'ApplicationLayout',
  waitOn: function() {
    return Meteor.subscribe('recentPosts');
  },
  data: function() {
    return {
      posts: Posts.find()
    };
  }
});

Router.route('/category/:_category', {
  name: 'category',
  template: 'category',
  layoutTemplate: 'ApplicationLayout',
  waitOn: function() {
    return Meteor.subscribe('categorizedPosts', this.params._category);
  },
  data: function() {
    return {
      posts: Posts.find(),
      category: this.params._category
    };
  }
});

server.js

Posts = new Mongo.Collection("posts");

Meteor.publish('recentPosts', function() {
  return Posts.find({}, {
    sort: {publishedAt: -1},
    fields: postListFields
  });
});

Meteor.publish('categorizedPosts', function(category) {
  return Posts.find({
    $or: [{category: {$regex: category}}]}, {
    sort: {publishedAt: -1},
    fields: postListFields
  });
});

在你的 "Posts" collection 上尝试使用方法 submitted: new Date(),然后在你的助手中用它排序:return Posts.find({}, {sort: {submitted: -1}});

本地存储数据的顺序与服务器提供给您的文档的顺序无关(如您所见)。还要考虑将具有不同排序顺序的多个出版物发送到一个本地集合的情况 - 如何处理?

在您的客户端代码的数据上下文中,您需要为 find() 方法指定排序顺序。这将使用 MiniMongo 对本地存储的帖子进行排序。它不会导致新的服务器请求,只有 subscribe 方法才会这样做。

你可能想知道在服务器上排序有什么意义?例如,如果您限制发送给客户端的帖子数量,那么服务器首先对它们进行排序非常重要,这样它才能发送正确的帖子(例如,按日期排序的前 10 个帖子) DDP link.

这样做的结果是您经常需要在服务器和客户端上复制 find() 方法的排序顺序。您可能希望尝试使用一些通用代码或变量来确保它们同步。