2017-06-04 1 views
0

イムFlowTemplateFlowRouterを使用してboth/router/router.jsに私がチェックしていますが、それは役割admin内のユーザーである:Roles.userIsInRoleはFALSEを返します - 流星

.... 
action: function() { 
    if(Roles.userIsInRole(Meteor.userId(), 'admin')){ 
     FlowLayout.render('layout', { 
      sidebar: 'sidebar', main:'admin', cart:'cart' 
     }) 
    } else { 
     FlowLayout.render('layout', { 
      sidebar: 'sidebar', main:'unauthorised', cart:'cart' 
     }) 
    } 

    console.log(Meteor.userId()); 

} 
.... 

FALSEを返しますが、私はWebコンソールで使用するときであるTRUE 。この行console.log(Meteor.userId());が正しいuserIDを出力し、私がログインしたときにWEBコンソールRoles.userIsInRole(Meteor.userId(), 'admin')でこれを行うと、それはTRUEです。

{{#if isInRole 'admin' }} 
    ADMIN 
{{/if}} 

それはTRUEですが、router.js戻りFALSEに:私はこれMeteor.user().rolesを行うと、結果は私がテンプレートにチェックした場合、それは役割のユーザーである['admin']

です。

修正方法?

答えて

2

rolesフィールドは、(別のサブスクリプションに基づいて)後の段階で受信される可能性があります。

このサブスクリプションが直接準備されていることを確認する必要があります。フィールドを取得して(たとえば、配列であることを確認して)、ルーティング/レンダリングを行うだけです決定。

1

私は遭遇したタイミングの問題のように聞こえます。私が解決しなければならなかった2つの競合条件(AccountsTemplatesを持つもの、準備が整っているもの)。それは、ここで議論されます:ここ

https://github.com/kadirahq/flow-router/issues/608

は私のソリューションです。それはroutes.jsのトップに行く:役割とAccountsTemplates両方が準備が整うまで

import {Tracker} from 'meteor/tracker'; 

if (Meteor.isClient) { 
    FlowRouter.wait(); 

    let tracker; 
    let self = this; 

    self.getATReady =() => AccountsTemplates._initialized; 

    let timer = Meteor.setInterval(function() { 
     if (self.getATReady()) { 
      tracker.invalidate(); 
      clearInterval(timer); 
     } 
    }, 500); 

    tracker = Tracker.autorun(function() { 
     if (!FlowRouter._initialized && Roles.subscription.ready() && self.getATReady()) { 
      clearInterval(timer); 
      FlowRouter.initialize(); 
     } 
    }); 
} 

基本的には、このコードはFlowRouterの初期化を防ぐことができます。一度準備が整ったら、FRが初期化され、役割を確認できることを知っているあなたのルートを使用することができます。

2016年8月以降、いくつかのMeteorバージョンでこの修正がありましたが、この問題は再発しませんでした。