如何从客户端的Meteor.users集合中读取角色数组?

时间:2017-04-16 10:16:04

标签: meteor

我使用套餐:alanning/meteor-roles

我正在为管理员构建一个简单的UI来管理其他用户角色。用户可以拥有多个角色,我使用复选框来选择角色。

我遇到的问题是我无法访问客户端代码中Meteor.users集合中存储的角色数组。

在帮助程序中,我正在检查用户角色,以便在UI中将其加载为已检查...

注意:现在所有用户都可以访问此HTML以进行测试。在我开始工作后,它将仅供管理员使用。所以我注意到此代码仅适用于已登录的用户,而不适用于所有用户。

我的代码:

HTML:

<label class="checkbox-inline"><input type="checkbox" class="userRole" value="r1" checked="{{isRoleChecked 'r1'}}">r1</label>
<label class="checkbox-inline"><input type="checkbox" class="userRole" value="r2" checked="{{isRoleChecked 'r2'}}">r2</label>
<label class="checkbox-inline"><input type="checkbox" class="userRole" value="r3" checked="{{isRoleChecked 'r3'}}">r3</label>
<label class="checkbox-inline"><input type="checkbox" class="userRole" value="r4" checked="{{isRoleChecked 'r4'}}">r4</label>
<label class="checkbox-inline"><input type="checkbox" class="userRole" value="r5" checked="{{isRoleChecked 'r5'}}">r5</label>
<label class="checkbox-inline"><input type="checkbox" class="userRole" value="r6" checked="{{isRoleChecked 'r6'}}">r6</label>

isRoleChecked帮助:(客户代码)

isRoleChecked: function(value) {

  // didn't work
  roles = Roles.getRolesForUser(this._id);
  if (roles) {
    for(var i=0; i < roles.length; i++) {
      if (roles[i] == value){
        return true;
      } else {
        return false;
      }
    }
  }
},

2 个答案:

答案 0 :(得分:2)

默认情况下,Meteor不会为profile集合发布Meteor.users以外的数据,但当前用户除外。理由是确保始终隐藏敏感数据。

  

如果安装了自动发布程序包,则会向所有客户端发布有关系统上所有用户的信息。其中包括* usernameprofile以及要公开的服务中的任何字段(例如services.facebook.idservices.twitter.screenName)。此外,使用自动发布时,会为当前登录的用户发布更多信息**,包括访问令牌。

(来源:https://docs.meteor.com/api/accounts.html#Meteor-users

*表示其他字段已排除,因此roles未发布autopublish

**这包括当前用户的roles字段。

这就是您的代码仅适用于当前用户的原因。

因此,您只需要将明确sends the roles field个用户的发布(并订阅它)设置为客户端:

Meteor.publish('usersRoles', function () {
  return Meteor.users.find(mySelector, {
    fields: {
      roles: 1
    }
  });
});

答案 1 :(得分:1)

您需要发布roles密钥:

服务器:

Meteor.publish('roles',() => {
  if ( Roles.userIsInRole(this.userId,['Admin']) {
    return Meteor.users.find({},{fields: {roles: 1}});
  } else this.ready();
});

在客户端订阅:

Meteor.subscribe('roles');