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}}