2014-10-03 36 views
3

我想有一些出版物只根据用户的角色返回用户有权访问的项目。我正在使用alanning:roles包来处理角色。基于登录用户的“角色”的流星中的动态出版物

举例来说,我有一个类似的出版物:

Meteor.publish('header_fields', function() { 
    console.log("header_fields: %j", this.userId); 
    if (Roles.userIsInRole(this.userId,['ADMIN','INSPECTOR'])) { 
     // Inspectors and Admins can see all header fields 
     return HeaderFields.find(); 
    } else { 
     // Clients should only be able to see header fields for forms they have access to 
     var user = Meteor.users.find({_id: this.userId}); 
     var formIds = []; 
     _.each(Forms.find({client_id: user.profile.client_id}).fetch(), function(form) { 
      this.push(form._id); 
     }, formIds); 
     return HeaderFields.find({form_id: {$in: formIds}}); 
    } 
}); 

我遇到的问题是,在我见过的所有例子中,发布在服务器中的文件夹中的.js文件定义,从而在客户端首次连接时运行并获取。但是,当客户端首次连接时,用户未登录。但是,我不知道应该把这些出版物放在哪里,或者它应该如何工作。

回答

3

流星处理默认情况下这个特殊的用例在一个优雅的方式,引述官方的文档:

this.userId

发布函数内部访问。登录用户的ID,如果没有用户登录,则返回null。这是常量。 但是,如果登录用户更改,则发布功能将重新运行 并显示新值。

http://docs.meteor.com/#publish_userId

所以基本上这意味着,如果你在客户端订阅返回基于this.userId不同的文件在你的榜样出版物,一切都应该工作开箱!

+1

是的,我只是再读一遍,看到它。现在它工作的很好,我只是用'if(this.userId)...'来包装每个出版物的整个内容。我的下一个混乱是,每次点击一个链接时,它都会重新运行这些出版物,就好像用户正在改变一样。不知道应该发生。 – CodeChimp 2014-10-03 01:06:56