Использование Meteor.users() в помощнике шаблона

У меня возникла проблема с получением данных профиля пользователя из помощника шаблона в Meteor 0.8.0. Этот код отлично работал в предыдущей версии, но после обновления сегодня утром он не работает. Первоначально я думал, что проблема заключается в том, что помощники шаблонов запускаются дважды, но когда я покопался, я обнаружил, что проблема немного сложнее.

Ниже помощник шаблона 'findClientLiason' вызывается дважды (его вывод регистрируется 2 раза в консоли). В первый раз пользователь будет отображаться как «неопределенный», во второй раз правильный пользовательский объект появится так, как я ожидаю. Оба раза 'clientLiason' будет выводиться правильно.

Самое интересное для меня, что если я удалю 'var user = Meteor.users.findOne({_id: clientLiason});' вызов, чтобы получить вызов findOne, помощник вызывается только один раз.

Мне кажется, что вызов коллекции Meteor.users вызывает другой вызов базы данных. И что при первом вызове коллекция Meteor.users пуста.

У меня есть публикация и подписка, показанные ниже. Я использую глобальную функцию waitOn() Iron Router, но мне интересно, следует ли загружать коллекцию Meteor.users раньше?

Любые идеи были бы хорошы. Спасибо еще раз.

publications.js

Meteor.publish('allUsers', function() {
    return Meteor.users.find();
});

router.js

Router.configure({
    layoutTemplate: 'layout',
    loadingTemplate: 'loading',
    waitOn: function() { 
        return [    
            Meteor.subscribe('clientsActive'),
            Meteor.subscribe('allUsers'),
            Meteor.subscribe('notifications')
        ];
}
});

clientItem.html

<template name="clientItem">
    {{findClientLiason clientLiason}}
</template>

clientItem.js

Template.clientItem.helpers({
    findClientLiason: function(clientLiason) {
        var user = Meteor.users.findOne({_id: clientLiason});
        console.log(clientLiason);
        console.log(user);
        return user.profile.name;
    }
});

person yankeyhotel    schedule 01.04.2014    source источник


Ответы (1)


Это имеет смысл, потому что происходит то, что сначала шаблон отображается, когда страница загружается, а коллекция пользователей пуста, а затем он повторно отображается при изменении данных (например, при заполнении локальной коллекции монго).

Вы должны написать свои шаблоны, чтобы ожидать запуска при загрузке страницы без данных. Я бы изменил помощника на что-то вроде этого:

findClientLiaison: function(clientLiaison) {
  var user = Meteor.users.findOne(clientLiaison);
  if (user) {
    return user.profile.name;
  }
  return "no data yet";
}
person Rahul    schedule 01.04.2014
comment
Ок, вроде исправили. Большое спасибо. Хотя пара вопросов. Изменилось ли это с выходом Blaze? Кроме того, есть ли проблема с повторением кода дважды, или это просто функция того, как он работает. Спасибо еще раз. - person yankeyhotel; 01.04.2014
comment
Вам всегда приходилось обращать внимание на начальное состояние загрузки, но Blaze изменил работу помощников, так что, вероятно, это как-то связано с этим. - person Rahul; 03.04.2014
comment
@yankeyhotel, почему имеет смысл findOne, а не find? см. этот воспроизводимый пример - person Sebastian; 04.06.2015