使用角色重新加载流星页面

时间:2018-07-18 09:30:18

标签: meteor roles

重新加载页面时,我的应用程序中的角色出现问题。如果我使用按钮等,然后像在网站上那样浏览,那么问题就不存在了。

但是有什么问题?在流星模板中,我应该为管理员和普通用户显示不同的视图,因此在模板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时尚未加载角色。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

软件包alanning:roles的工作方式是,将角色定义“自动发布”到客户端,以便您可以“立即”使用它们。

在这种情况下,即表示订阅已准备就绪。在此之前,函数Roles.userIsInRole不会返回任何真值。

为了检查它们是否可用,请使用反应性Roles.subscription.ready()方法。

如果您在onRendered中的反应性方面遇到问题,可以检查autorunonCreated中的角色。

例如:

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重新检查方法/发布中对方法敏感的每个方法调用和订阅两次。

相关问题