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

时间:2015-02-11 09:05:15

标签: javascript mongodb meteor

我使用Meteor.js制作了一个简单的博客网站。在索引中,页面显示最近的帖子,列表可以按标签和类别重新排列。它(当然)也有每个帖子的单独页面。

刷新索引时,列表排序良好,按publishedAt排序。当我尝试按标签或类别排列帖子时,甚至当我去看个别帖子时,它都很好。但是当我回到索引时,最后提取的帖子(或后一种情况中的帖子)始终位于列表顶部,未按publishedAt正确排序。

例如,我们说我们有4-3-2-1的清单。通过排序,我有3-2。当我回到索引时,现在列表就像3-2-4-1。

console.log()来自client.js时,会先记录最后提取的帖子,然后记录其他帖子,包括已记录的帖子。如何在不受以前提取的数据影响的情况下获取帖子?

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
  });
});

2 个答案:

答案 0 :(得分:1)

在“帖子”集合中尝试使用方法submitted: new Date(),然后在帮助程序中对其进行排序:return Posts.find({}, {sort: {submitted: -1}});

答案 1 :(得分:1)

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

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

您可能想知道在服务器上排序的重点是什么?例如,如果您要限制发送给客户端的帖子数量,那么服务器首先对它们进行排序以便它发送正确的帖子(例如按日期排序的前10个帖子)非常重要DDP链接。

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