2016-04-02 8 views
1

流星の中のクライアント側の(別の)ユーザーの詳細にアクセスしようとしています。私は 'acc'と呼ばれるテンプレートヘルパーから呼び出す 'userDetails'というサーバー側のメソッドを持っています。流星:クライアントのユーザーの詳細にアクセスする

サーバー方法:

'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

のように、このヘルパーを使用することができ、あなたのhtmlでここ

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

Sessionオプションを使用しますSessionまたはReactiveVarまたはReactiveDict

を使用するかでありますそのようなテンプレートヘルパーにアクセスすることはできません。出力を見るには、テンプレート自体に 'acc'を使用する必要があります。 –

+0

こんにちは@BlazeSahlzen、テンプレートで{{acc.profile.birthday}}を使用できないと言っていますか?それは私がやっていることなので... – L4zl0w

+1

ああ、すみません、私は誤解しています。はい、あなたはそれを行うことができます。 'res'オブジェクトを返す前に、そのオブジェクトがどのような構造体を持っているかを確かめることができます。 –

答えて

2

メテオール呼び出しは非同期呼び出しであり、ヘルパーがデータを返さない理由です。ここ

最良のオプションは、私はあなたがこの

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

'return'文がメソッド呼び出しの外にあるべきではありませんか? –

+1

はい、今変更しました – Sasikanth

+1

ありがとう、私はこのアプローチで動作させることができました。 – L4zl0w

2

else文でリターンをラップする必要があります。

if(error) { 

} 
else { 
    return res; 
} 

あなたへの呼び出しは非同期で行います。これは、サーバーメソッドが完了したときにコールバック関数が実行されることを意味します。

テンプレートに結果を表示したい場合は、2つの可能性があります。

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 2番目のヘルパーは必要ないように答えを更新しました。質問に未回答の回答がないようにマークしてください。 – hlx

関連する問題