我正在FlowRouter
使用FlowTemplate
,both/router/router.js
我正在检查角色admin
中的用户:
....
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
。如果我执行此操作Meteor.user().roles
,则结果为['admin']
如果我签入模板,那么用户是角色:
{{#if isInRole 'admin' }}
ADMIN
{{/if}}
它是TRUE
,但在router.js
返回FALSE
。
如何解决?
答案 0 :(得分:2)
可能会在稍后阶段收到roles
字段(基于不同的订阅)。
您应确保此订阅已准备就绪 - 直接或通过使用其他一些机制来确保您获取该字段(例如确保它是一个数组),然后才进行路由/呈现决策
答案 1 :(得分:1)
https://github.com/kadirahq/flow-router/issues/608
这是我的解决方案。它位于routes.js的顶部:
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的初始化,直到角色和AccountsTemplates都准备就绪。一旦他们准备就绪,FR就会被初始化,你可以使用你的路线知道你可以检查角色。
自2016年8月以来,我已经在几个Meteor版本中解决了这个问题,并且我没有看到问题再次发生。