我使用套餐: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;
}
}
}
},
答案 0 :(得分:2)
默认情况下,Meteor不会为profile
集合发布Meteor.users
以外的数据,但当前用户除外。理由是确保始终隐藏敏感数据。
如果安装了自动发布程序包,则会向所有客户端发布有关系统上所有用户的信息。其中包括*
username
,profile
以及要公开的服务中的任何字段(例如services.facebook.id
,services.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');