2016-04-02 22 views
1

Kullanıcı bilgisine (başka bir kullanıcı) meteoR'de müşteri tarafında erişmeye çalışıyorum. 'Acc' olarak adlandırılan bir şablon yardımcısından aradığım 'userDetails' adlı bir sunucu tarafı yöntemim var.Meteor: Kullanıcı bilgilerinize erişme

Sunucu yöntemi:

'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 
            }}); 
    } 

Şablon yardımcısı: Ben şablonda acc.profile.birthday erişmeye çalıştığınızda

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

ben bir şey alamadım. Buna ne sebep olabilir?

+0

gibi bu yardımcı kullanabileceğiniz html olarak burada

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

Session seçeneğini kullanacağız Session veya ReactiveVar veya ReactiveDict

kullanmak için her bir Bunun gibi bir Şablon yardımcılarına erişemezsiniz. Çıktıyı görmek için Şablonda 'acc' kullanmalısınız. –

+0

Merhaba @BlazeSahlzen, şablonda {{acc.profile.birthday}} kullanamayacağımı mı söylüyorsunuz? Çünkü yaptığım şey bu ... – L4zl0w

+1

Oh, üzgünüm, yanlış anladım. Evet, bunu yapabilirsin. Nesneyi hangi yapının olduğundan emin olmak için geri göndermeden önce 'res' nesnesini birleştirmeyi deneyebilirsiniz. –

cevap

2

Meteor çağrıları zamanuyumsuz çağrılardır, bu yüzden yardımcınız herhangi bir veriyi geri göndermez. Burada

iyi seçenek Bunu

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

'return' ifadesi Metot çağrısı dışında mı olmalıdır? –

+1

evet, şimdi değiştirdi – Sasikanth

+1

Teşekkürler, bu yaklaşımla çalışmayı başardım. – L4zl0w

2

Geri dönüşü başka bir bildirimde sarmanız gerekir.

if(error) { 

} 
else { 
    return res; 
} 

Senkronize olmayan yöntemle çağrı. Bu, sunucu yönteminiz tamamlandığında geri arama işlevinin yürütüleceği anlamına gelir.

1/a oturumu kullanın: Eğer bir şablona sonucunu görüntülemek isterseniz

, sen iki ihtimal var.

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

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

2/Kullanım Şablon abonelikleri (daha iyi bir çözüm): sunucuda , verileri yayınlamak: Ýstemcide

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

, abone:

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

Daha sonra doğrudan müşteri üzerinde bir yardımcı oluşturabilir ve findOne'u arayabileceksiniz. html olarak

: kullanıcılarla ilgili

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

Önemli Uyarı: kullanıcılar profilinde varsayılan olarak düzenlenebilir. Lütfen şu sayfayı okuyun: https://dweldon.silvrback.com/common-mistakes

+0

Teşekkür @hlx, bu güzel ve kapsamlı bir cevap, ancak oturumun ikinci bir yardımcısı olacağından emin değilim. – L4zl0w

+0

@ L4zl0w Cevabı güncelledim, böylece ikinci bir yardımcıya ihtiyacınız olmayacak. Lütfen cevabı işaretleyin, böylece soru cevapsız görünmüyor – hlx