我应该如何保持我的出版物的反应性
How should I keep my publication reactive?
>我正在从自定义用户权限管理系统迁移到Alanning:roles v2.0。我有一个非常基本的结构:
- 基本用户 用户
- 组,每个用户组都有特定的设置。我将它们存储在"组"集合中。
- 管理组的用户的组管理员状态(每个组都有其组管理员)。
我以前将组成员和管理员 mongo _id
存储在"组"文档中。这样,我可以被动地发布组:我只需要检查userId
是否在组文档中,在"成员"或"管理员"字段中。
现在我切换到由Alanning:roles强制执行的正确管理,我在我的出版物中做了这样的事情:
const userGroupsAsAdmin = Roles.getPartitionsForUser (this.userId, ['group_admin'])
const userGroupsAsMember = Roles.getPartitionsForUser (this.userId, ['member'])
const selector = {$or:[{'_id':{$in: userGroupsAsMember}},{'_id':{$in: userGroupsAsAdmin}}]}
const options = {}
const response = Groups.find(selector, options)
return response
请注意,Roles.getPartitionsForUser ()
只是Roles.getGroupsForUser ()
的新函数名称。
此处的问题是发布不会监视role
集合中的更改,因此当用户成为成员时,发布不会更新。我知道这是一个常见问题,我知道 3 种解决此问题的方法,但没有一种方法令人满意:
最佳候选者:非规范化和复制。我将
members
和admins
字段保留在组文档中。让我烦恼的是,我将保留同一事物的 2 个版本,并有可能出现不一致。向发布添加一个参数,并使用此参数重新运行它(例如
userGroupsAsMember
),但它依赖于客户端并使其发送不必要的信息。直接或使用包使用低级别发布 API。我过去已经直接这样做了,但我不想再依赖
Cursor.observe()
,因为它不能有效地扩展并产生不必要的服务器负载。
我错过了一个选项吗?如果没有,保持出版物反应的最佳方式是什么?
使用 reywood:publish-composite
创建反应式联接。
Meteor.publishComposite("my-groups", {
find: function() {
// findOne won't work, it's not a cursor
return Meteor.users.find(
{_id: this.userId},
{fields: {roles: 1}}
);
},
children: [{
find: function(user) {
// getPartitionsForUser allows the first parameter to be the actual user object.
const userGroupsAsAdmin = Roles.getPartitionsForUser (user, ['group_admin']);
const userGroupsAsMember = Roles.getPartitionsForUser (user, ['member']);
const selector = {$or:[{'_id':{$in: userGroupsAsMember}},{'_id':{$in: userGroupsAsAdmin}}]};
const options = {};
const response = Groups.find(selector, options);
return response;
}
}]
});
Roles.getPartitionsForUser
不返回游标,因此它不能是反应式的。这就是为什么您还需要发布Meteor.users.find
通话的原因。
- 在Angular 2中布线期间保持零部件处于活动状态
- Chrome应用程序调整窗口大小保持纵横比
- ScriptManager.RegisterStartupScript保持多次添加脚本块
- 在文本区域中使用jQuery.text()保持换行符
- 滚动后保持固定的菜单栏不起作用
- 悬停下拉菜单即使在鼠标移出后也保持活动状态
- 如何保持引导程序下拉复选框列表下拉
- 使用纯javascript而非jquery使所选选项卡处于活动状态并保持非活动状态
- 角度复选框不会保持选中状态
- 如何使线条的边缘像素保持半透明
- 展开移动设备上的折叠菜单,同时在桌面上保持悬停
- 如何在ui路由器angularjs中只更改子ui视图,同时保持父视图不变
- 如何保持会话的活力
- 获得多个手风琴部分以保持开放
- 如何保持数组格式的值
- Jquery Draggable-在浏览器刷新时保持位置
- 保持节点服务器运行”;观看“;让事情发生
- “createImageData()”和“new ImageData(()”有何不同
- CORS保持在SecurityError上:操作不安全
- 我应该如何保持我的出版物的反应性