如何在模板中显示多个远程发布的文档?

时间:2015-10-23 09:11:33

标签: meteor

我希望使用Meteor通过DDP订阅一些远程出版物。然后在一个模板中显示文档。这是我做的:

Posts = {};

var lists = [
  {server: "localhost:4000"},
  {server: "localhost:5000"}
];

var startup = function () {
  _.each(lists, function (list) {
    var connection = DDP.connect(`http://${list.server}`);
    Posts[`${list.server}`] = new Mongo.Collection('posts', {connection: connection});
    connection.subscribe("allPosts");
  });
}

startup();

此文件位于客户端文件夹中。每个启动,在本例中,在浏览器中我有两个客户端集合Posts [“localhost:4000”]和Posts [“localhost:5000”],两者都是相同的模式。我知道这种格式(Collection [服务器])很难看,请告诉我是否有更好的方法。

有没有办法在带有被动的同一模板中显示这些客户端集合。像这样:

Template.registerHelper("posts", function () {
  return Posts.find({}, {sort: {createdAt: -1}});
});

我认为Connected Client是Meteor的重要组成部分。应该有一个最佳实践来解决这个问题,对吧?

1 个答案:

答案 0 :(得分:0)

解决。

通过DDP连接到多个服务器,然后通过cursor.observeChanges观察其收集的反应。

Posts = {};
PostsHandle = {};
// LocalPosts is a local collection lived at browser.
LocalPosts = new Mongo.Collection(null); // null means local

// userId is generated by another Meteor app.
var lists = [
  {server: "localhost:4000", userId: [
    "hocm8Cd3SjztwtiBr",
    "492WZqeqCxrDqfG5u"
  ]},
  {server: "localhost:5000", userId: [
    "X3oicwXho45xzmyc6",
    "iZY4CdELFN9eQv5sa"
  ]}
];

var connect = function () {
  _.each(lists, function (list) {
    console.log("connect:", list.server, list.userId);
    var connection = DDP.connect(`http://${list.server}`);
    Posts[`${list.server}`] = new Mongo.Collection('posts', {connection: connection}); // 'posts' should be same with remote collection name.
    PostsHandle[`${list.server}`] = connection.subscribe("posts", list.userId);
  });
};

var observe = function () {
  _.each(PostsHandle, function (handle, server) {
    Tracker.autorun(function () {
      if (handle.ready()) {
        console.log(server, handle.ready());
        // learn from http://docs.meteor.com/#/full/observe_changes
        // thank you cursor.observeChanges
        var cursor = Posts[server].find();
        var cursorHandle = cursor.observeChanges({
          added: function (id, post) {
            console.log("added:", id, post);
            piece._id = id; // sync post's _id
            LocalPosts.insert(post);
          },
          removed: function (id) {
            console.log("removed:", id);
            LocalPosts.remove(id);
          }
        });
      }
    })
  });
}

Template.posts.onCreated(function () {
  connect(); // template level subscriptions
});

Template.posts.helpers({
  posts: function () {
    observe();
    return LocalPosts.find({}, {sort: {createdAt: -1}}); // sort reactive
  }
});