MeteorJS Tracker: как вернуть значение после подписки?

Получил эту проблему с Tracker.autorun() метод:

Template.registerHelper('getUserName', (userId) => {

    let userName = '';
    Tracker.autorun((tracker) => {
        if (userId) {
            let subscription = Meteor.subscribe('userName', userId);
            if (subscription.ready()) {
                tracker.stop();
                let user = Meteor.users.findOne({_id: userId}, {fields: {emails: 0}});
                userName = user.services.facebook.name;
            }
        }
    });
    return userName;

});

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

Я пробовал это:

Template.registerHelper('getUserName', (userId) => {

    let subscription;
    Tracker.autorun((tracker) => {
        if (userId) {
            subscription = Meteor.subscribe('userName', userId);
        }
    });
    if (subscription.ready()) {
        let user = Meteor.users.findOne({_id: userId}, {fields: {emails: 0}});
        return user.services.facebook.name;
    }

}); 

Но подписка не имеет метода .ready() еще.

Любые идеи о том, как работать с областями здесь? Я помню, что замыкания могут быть полезны.

1 ответ

Решение

Я думаю, что вы хотите удалить свою подписку из вашего помощника. Это лучше оставить шаблонам, вызывающим помощника в функции onCreated(). Проверьте эту ссылку для справки: http://guide.meteor.com/data-loading.html

Так что ваш помощник будет выглядеть так:

Template.registerHelper('getUserName', (userId) => {
    let user = Meteor.users.findOne({_id: userId}, {fields: {emails: 0}});
    if( user && user.services && user.services.facebook) {
        return user.services.facebook.name;
    }
});

И тогда в вашем шаблоне вы сделаете:

{{#if getUserName currentUser}}
    <!-- Your code here. -->
{{else}}
    <!-- What to do if you don't have a user defined yet. -->
{{/if}}
Другие вопросы по тегам