Meteor で、{{#IF}}を使って、セキュアな環境で、管理者だけが見られる情報を表示するには?
こんにちは。Meteor初心者です。
meteor remove insecure した後で、サーバで判定した結果を、どうやって{{#IF}}に認識してもらうか、というところで行き詰っています。
【 やりたいこと 】
{{#each}}を使って、データベースのカーソルをsubscribeするのではなく、
{{#IF}}を使って、適当なテキストを、管理者のメールアドレスでログインした相手にだけ見せたいのですが、方法がわかりません。
【 症状 】
後述のようなコードですが、サーバ側で管理者かどうかをチェックする部分は、きちんとtrue/falseを判定できています。しかし、クライアント側にその結果が戻されず、undefined になってしまいます。
【 調べて考えたこと 】
http://docs.meteor.com/#/full/meteor_call
には、"On the client, if you do not pass a callback and you are not inside a stub, call will return undefined, .." とあるので、まさに症状に合致します。それではということで callbackで書くと、
1.非同期なので、判定のタイミングが遅いと、{{#IF}}に反映されないおそれがある?
2.callback関数で判定したtrue/falseの結果を、もとの{{#IF}}まで戻す方法がわからない。
という問題を抱えています。2は最悪、グローバル変数かデータベースに保存すればいいのかとも思いますが・・
こうしたケースは、普通にありそうに思うのですが、何かスマートな方法をご存じないでしょうか。
【 コード 】
ーclient.htmlーーーーーーーーーーーーーー
<template name="showToAdmin">
{{#if showToAdminText}}
適当なテキスト
{{/if}}
</template>
ーclient.jsーーーーーーーーーーーーーー
Template.showToAdmin.helpers({
'showToAdminText':function(){
return Meteor.call('showToAdminText');
}
});
ーserver.jsーーーーーーーーーーーーーー
Meteor.methods({
'showToAdminText':function() {
var currentUserId = this.userId;
if (currentUserId) {
var address = Meteor.users.findOne(currentUserId).emails[0].address;
return (address == 'admin@gmail.com');
}
return false;
}
});