2016-04-02 3 views
1

Я пытаюсь получить доступ к другим данным пользователя на стороне клиента в метеор. У меня есть метод на стороне сервера, называемый «userDetails», который я вызываю из помощника шаблона, называемого «acc».Метеор: доступ к деталям пользователя на клиенте

метод сервера: помощник

'userDetails': function(userId) { 
     check(userId, String); 
     return Meteor.users.findOne({_id: userId}, 
            {fields: { 
            "services.facebook.first_name": 1, 
            "profile.birthday": 1, 
            "services.facebook.gender": 1, 
            "profile.location.name": 1 
            }}); 
    } 

Шаблон:

acc: function(_id) { 
    Meteor.call('userDetails', _id, function(err, res) { 
     if(err) throw error; 
     return res; 
    }); 
    } 

Когда я пытаюсь получить доступ к acc.profile.birthday в шаблоне я не получаю ничего. Что может быть причиной этого?

+0

Вы не можете получить доступ к помощнику Template. Вы должны использовать 'acc' в самом шаблоне, чтобы увидеть результат. –

+0

Привет @BlazeSahlzen, вы говорите, что я не могу использовать {{acc.profile.birthday}} в шаблоне? Потому что это то, что я делаю ... – L4zl0w

+1

О, извините, я неправильно понял. Да, вы можете это сделать. Вы можете попробовать утешить объект res, прежде чем возвращать его, чтобы быть уверенным в структуре, которой обладает объект. –

ответ

2

Метеорные вызовы - это асинхронные вызовы, поэтому ваш помощник не возвращает никаких данных.

Лучший вариант здесь либо использовать Session или ReactiveVar или ReactiveDict

Я буду использовать Session вариант здесь

acc: function(_id) { 
    Meteor.call('userDetails', _id, function(err, res) { 
    if(err){ 

    }else{ 
     Session.set('userDetails', res) 
    } 

    }); 
    return Session.get('userDetails') 
} 

В вашем HTML вы можете использовать этот помощник, как это

{{#if acc}} 
    {{name}} 
    ... 
{{else}} 
    <p>Information not found</p> 
{{/if}} 
+1

Не должно ли выражение 'return' быть вне вызова метода? –

+1

yes, изменил его сейчас – Sasikanth

+1

Спасибо, мне удалось заставить его работать с этим подходом. – L4zl0w

2

Вы должны обернуть возврат в оператор else.

if(error) { 

} 
else { 
    return res; 
} 

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

Если вы хотите отобразить результат на шаблоне, у вас есть две возможности:

1/Использование сеанса.

acc: function(_id) { 
    Meteor.call('userDetails', _id, function(err, res) { 
    if(err){ 
    }else{ 
     Session.set('data', res) 
    } 

    }); 
    return Session.get('data') 
} 

2/подписки Использование шаблонов (лучшее решение): На сервере публикации данных:

Meteor.publish("data", function(){ 
    return Meteor.users.findOne(...) 
}); 

На клиенте, вы подписались:

Template.mytemplate.onCreated(function() { 
    Template.instance().subscribe("data"); 
}); 

Затем прямо на клиенте вы сможете создать помощника и вызвать findOne.

В HTML:

{{#if Template.subscriptionsReady}} 
    {{#each myHelper}} 
     {{acc.profile.birthday}} 
    {{/each}} 
    {{else}} 
    <p>Loading...</p> 
    {{/if}} 

Важная информация о пользователях: профиль пользователя редактируются по умолчанию. Пожалуйста, прочтите следующее: https://dweldon.silvrback.com/common-mistakes

+0

Спасибо @hlx, это хороший и всеобъемлющий ответ, однако я не уверен, что у меня будет второй помощник, чтобы вернуть сеанс. – L4zl0w

+0

@ L4zl0w Я обновил ответ, чтобы вам не понадобился второй помощник. Пожалуйста, отметьте ответ, чтобы вопрос больше не оставался без ответа – hlx

Смежные вопросы