重新加载页面时,我的应用程序中的角色出现问题。如果我使用按钮等,然后像在网站上那样浏览,那么问题就不存在了。
但是有什么问题?在流星模板中,我应该为管理员和普通用户显示不同的视图,因此在模板onRendered函数中,我检查角色并对此做出反应。代码如下:
/* Predefined changes to current html are done in this function!*/
Template.Planning.onRendered(function () {
var userid = Meteor.userId();
if (Roles.userIsInRole(userid,'admin', Roles.GLOBAL_GROUP)){
//do something
}
});
由于特定原因,当我以管理员身份登录时,if-block内的代码未执行,但重新加载了页面。当我使用导航栏访问它时,它确实起作用,因此我猜想在调用onRendered-function时尚未加载角色。我该如何解决这个问题?
答案 0 :(得分:2)
软件包alanning:roles
的工作方式是,将角色定义“自动发布”到客户端,以便您可以“立即”使用它们。
在这种情况下,即表示订阅已准备就绪。在此之前,函数Roles.userIsInRole
不会返回任何真值。
为了检查它们是否可用,请使用反应性Roles.subscription.ready()
方法。
如果您在onRendered
中的反应性方面遇到问题,可以检查autorun
中onCreated
中的角色。
例如:
Template.Planning.onCreated(function () {
const instance = this
instance.state = new ReactiveDict()
instance.autorun(() => {
if (Roles.subscription.ready()) {
var userid = Meteor.userId()
if (Roles.userIsInRole(userid,'admin', Roles.GLOBAL_GROUP)){
instance.state.set('isAdmin', true) // reactive data source
}
}
})
})
在路由器中使用
您甚至可以在路由器级别使用此方法,以便“等待”所有要加载的角色。当您的客户端路由逻辑大量使用角色来管理访问权限时,这尤其有意义。
安全注意事项
别忘了,这只是UI Candy。可以忽略客户端上的角色(以及路由)。使用Roles.userIsInRole
重新检查方法/发布中对方法敏感的每个方法调用和订阅两次。