2014-10-03 38 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