Подпишитесь на обновления коллекции Meteor.users

Я использую react-komposer и React в своем приложении, и в какой-то момент я изменяю свойство profile пользователя Meteor.users элемент коллекции, отражающий текущего пользователя. Проблема здесь в том, что он не выполняет обратную петлю при вызове render. Что бы я ни делал с коллекцией Meteor.users, даже если я ссылаюсь на Meteor.user() в функции render, компонент не перерисовывается. Если я сделаю

render() {
  console.log('rendered');

  /// ...
}

тогда я могу увидеть «рендеринг» на консоли только дважды: один раз компонент был первоначально визуализирован, а второй раз другие подписки готовы.

Я хотел бы подписаться на коллекцию Meteor.users, но не знаю, как это сделать.

Я определенно мог бы использовать Tracker, чтобы реагировать на каждый цикл Tracker, но мне он кажется слишком 1.2. Но единственный ли это способ?

Кроме того, я определенно читал другие вопросы и ответы о Meteor.users, такие как этот или этот, но идея обернуть коллекцию пользователей в pub/sub напрямую кажется неестественной, и вряд ли это хороший способ слушать каждое обновление коллекции.


person rishat    schedule 22.08.2016    source источник
comment
Нет ничего противоестественного в публикации и подписке на Meteor.users. Смотрите мой ответ ниже.   -  person rdk1992    schedule 23.08.2016


Ответы (1)


Вы должны сделать публикацию на серверном коде, касающемся коллекции meteor.users.

    Meteor.publish('allUsers', function allUsers() {
      return Meteor.users.find({}, {
        fields: {
          services: 0,
        },
     });
   });

Затем вы можете подписаться в своем контейнере на эту публикацию и запросить коллекцию Meteor.users и отправить этот результат компоненту.

const composer = (props, onData) => {
const userHandle = Meteor.subscribe('allUsers');
if (userHandle.ready()) {
    const users = Meteor.users.find({}).fetch();
    onData(null, {
        users,
    });
}
};
export default composeWithTracker(composer)(YourComponent);

После этого любые изменения, внесенные в коллекцию внутри YourComponent, будут отражены на стороне клиента.

person rdk1992    schedule 23.08.2016