2016-01-20 54 views
0

得到這個問題的Tracker.autorun()方法:MeteorJS跟蹤器:訂閱後如何返回一個值?

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; 

}); 

我想從出版返回用戶名,但範圍是棘手的,因爲助手返回一個空字符串,而跟蹤仍在訂閱數據。

我已經試過這樣:

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

很好的建議。關於訂閱的地方(我已經閱讀了流星指南,但是當你需要一個只在需要時才訂閱的全球幫手時,不知道該怎麼辦),還是應該在每個'onCreated() '? – Gus

+1

如果你確定一直都想要它,那麼你會在你的身體上做這件事......例如, Template.body.onCreated(()=> {... –