2015-01-02 2 views
4

Я понимаю, что подписка является способом записи потока в коллекцию на стороне клиента, от this post и других ...В Meteor, как я могу запросить только записи данной подписки?

Однако в this post, Вы можете иметь несколько подписок, которые текут в ту же коллекцию.

// server 
Meteor.publish('posts-current-user', function publishFunction() { 
    return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10}); 
    // this.userId is provided by Meteor - http://docs.meteor.com/#publish_userId 
} 
Meteor.publish('posts-by-user', function publishFunction(who) { 
    return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10}); 
} 

// client 
Meteor.subscribe('posts-current-user'); 
Meteor.subscribe('posts-by-user', someUser); 

Теперь - я получил свои записи через две разные подписки, могу ли я использовать подписку, чтобы добраться до записей, которые она оттащила? Или я должен выполнить свою коллекцию? Какова наилучшая практика для совместного использования этого запроса между клиентом и сервером?

Надеюсь, что я не пропущу что-то очевидное здесь, но выполнение функции Meteor.subscribe только для ее побочных эффектов, похоже, теряет очень полезную информацию - а именно, из какой подписки взялась запись. Предположительно, названия публикаций и подписки выбраны для того, чтобы иметь смысл - было бы неплохо, если бы я мог получить записи, связанные с этим именем.

+0

возможно дубликат [как знать, какие документы направляются клиенту в метеора] (http://stackoverflow.com/questions/27737391/how-to-know-which-docs-are -sent-to-the-client-in-meteor) –

+0

См. мой комментарий к вопросу выше. Вероятно, вам нужно преобразование, чтобы отметить, какие документы пришли от издателя. В общем, это похоже на проблему «вы делаете неправильно», если это действительно проблема. Можете ли вы объяснить, почему это было бы важно в вашем случае использования? –

+0

Возможный дубликат [Meteor публикует/подписывает стратегии для уникальных коллекций на стороне клиента] (http://stackoverflow.com/questions/12223866/meteor-publish-subscribe-strategies-for-unique-client-side-collections) – malhal

ответ

6

Что вы хотите сделать, это сохранить две отдельные коллекции записей, где каждая коллекция заполняется другой публикацией. Если вы прочитаете DDP specification, вы увидите, что сервер сообщает клиенту, к какой коллекции (а не к публикации) принадлежит каждая запись, и несколько публикаций могут фактически предоставлять разные поля для одной записи.

Однако Meteor фактически позволяет отправлять записи любому произвольному имени коллекции, и клиент увидит, имеет ли он эту коллекцию.Например:

if (Meteor.isServer) { 
    Posts = new Mongo.Collection('posts'); 
} 

if (Meteor.isClient) { 
    MyPosts = new MongoCollection('my-posts'); 
    OtherPosts = new MongoCollection('other-posts'); 
} 

if (Meteor.isServer) { 
    Meteor.publish('my-posts', function() { 
    if (!this.userId) throw new Meteor.Error(); 

    Mongo.Collection._publishCursor(Posts.find({ 
     userId: this.UserId 
    }), this, 'my-posts'); 

    this.ready(); 
    }); 

    Meteor.publish('other-posts', function() { 
    Mongo.Collection._publishCursor(Posts.find({ 
     userId: { 
     $ne: this.userId 
     } 
    }), this, 'other-posts'); 

    this.ready(); 
    }); 
} 

if (Meteor.isClient) { 
    Meteor.subscribe('my-posts', function() { 
    console.log(MyPosts.find().count()); 
    }); 

    Meteor.subscribe('other-posts', function() { 
    console.log(OtherPosts.find().count()); 
    }); 
} 
0

Конечно! Это зависит от того, где вы пишете подписки. Во многих случаях вы можете использовать Iron Router, и в этом случае у вас будет определенный маршрут для подписки на нужные вам данные. Затем изнутри помощника шаблона маршрута вы можете запрашивать документы только внутри этой подписки.

Но общая идея заключается в том, что вы подключаете определенную подписку к определенному шаблону.

Template.onePost.helpers({ 
    post: function() { 
    Meteor.subscribe('just-one-post', <id of post>); 
    return Posts.findOne(); 
    } 
}); 

Template.allPosts.helpers({ 
    posts: function() { 
    Meteor.subscribe('all-posts'); 
    return Posts.find(); 
    } 
)); 
+0

Интересно, что утюг-роутер звучит интересно, и я попробую это. Я не уверен, что подписка на помощника - это то, с чем мне было бы комфортно, поскольку я менее четко понимаю, когда эти подписки прекратятся. –

2

Это то, что происходит:

Скажите, что ваш серверный BlogPosts Монго коллекция содержит 500 сообщений из 10 различных пользователей. Затем вы подписаться на двух различных подписок на клиенте:

Meteor.subscribe('posts-current-user'); // say that this has 50 documents 
Meteor.subscribe('posts-by-user', someUser); // say that this has 100 documents 

Метеор будет видеть Meteor.subscribe('posts-current-user'); и перейти к загрузке постов текущего пользователя на стороне клиента BlogPosts коллекции Mini-Монго в.

Meteor затем увидит Meteor.subscribe('posts-by-user', someUser); и приступит к загрузке сообщений someuser на клиентскую плату Mini-Mongo's BlogPosts.

Итак, теперь на клиентской стороне Mini-Mongo BlogPosts имеется 150 документов, которые являются подмножеством из 500 общих документов в коллекции server-side BlogPosts.

Так что если вы сделали BlogPosts.find().fetch().count у своего клиента (Chrome Console), результат будет 150.

+0

Я думаю, что вопрос был на клиенте, как вы получаете только посты? Я не думаю, что вы так далеко зашли в ответ. Я считаю, что вы находят на клиенте тот же запрос, который используется для публикации на сервере. – malhal

Смежные вопросы