2015-04-10 5 views
0

Существует несколько примеров публикации/подписания, но не ясно, что является лучшей практикой для хранения пользовательских данных во встроенной коллекции «пользователей» в Meteor (особенно в новой возможности коллекций с конкретными шаблонами).Meteor: какой способ добавить пользовательский объект настроек в коллекцию пользователей?

Например, мне нужно хранить историю пользователей обзора - то, что доступно по Meteor.user().settings.history.lastvisited[]

Задача состоит в том:

  1. ли какие-либо специальные публикации/подписки, необходимые для выше? ( причины того, я предполагаю, что в users коллекции уже опубликовано и доступны на стороне клиента - так что нам нужно еще?)
  2. Как заботиться о краевыми случаях, когда пользователь является новым и, следовательно, settings.history объекта не может быть определены? Можем ли мы создать специальное издание, которое автоматически заботится о создании пустого объекта, если settings не определено? Как это сделать?

Я сделал это:

// server side 
Meteor.publish('userSettings', function (maxRows) { 
    if (this.userId) { 
     return Meteor.users.find({ _id: this.userId }, { fields: {'settings':1}}); 
    } 
    this.ready(); 
}); 

//client side 
Meteor.subscribe('userSettings'); 

Но я не вижу, во всяком случае, как я могу получить доступ к опубликованному «UserSettings» объект на стороне клиента - что не хватает ??

ответ

1

Вы можете создать поле и установить его на false/'', для каждого создаваемого вами пользователя с использованием метода accountsOnCreateUser.

Accounts.onCreateUser(function(options, user) { 
    //this function gets called each time a user has been created on the Meteor.user collection 
    if (options.profile) 
    user.settings = ''; //this is just and example. 
    return user; 
}) 

Теперь публиковать выглядит нормально, но для того, чтобы заставить его работать IM всегда использовать Tracker.autorun функцию.

Tracker.autorun(function(){ 
    Meteor.subscribe('userSettings'); 
}) 

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

Берегите ваш отрицаю/разрешить разрешения, проверить этот meteor:common mistakes пост на редактирования профиля секции

Также функция подписки имеют функцию обратного вызова. Meteor.subscribe(name, [arg1, arg2...], [callbacks]), поэтому вы можете сделать что-то подобное.

var myUserSubscription = Meteor.subscribe('userSettings',function(){ 
console.log("ok im here on the client side") 
console.log("this user subscription is ready " + myUserSubscription.ready()) 
}) 

console.log("outside the subscription why not? " + myUserSubscription.ready(); 

О себе ready();

Истинно, если сервер отметил подписку как готовую. Реактивный источник данных .

+0

Спасибо Ethaan. Как получить доступ к подписанной коллекции 'userSettings' на стороне клиента? Через «Meteor.user(). Настройки« как обычно »(в этом случае цель публикации/подписаться). –

+0

по умолчанию только опубликованный клиентом «профиль, имя пользователя, адрес электронной почты», любое другое поле, которое вы хотите опубликовать на стороне клиента, должно быть опубликовано в функции публикации (чертовски много раз публикует слово) – Ethaan

+0

Cool - Thanks , Итак, если я правильно понял - 'publish (userSettings, ...) 'позволит настраивать поля в запросе для публикации клиенту, но мы по-прежнему получаем доступ к этим полям через' Meteor.user(). customField' correct? –