Meteor Iron Router重新订阅权利变更与流星角色

时间:2015-06-17 18:15:27

标签: meteor iron-router

我正在编写一个带有用户角色系统的流星应用程序(alanning:roles)我的角色是基于组的。当用户知道我的组URL时,允许访问该组并在该组中获得角色“defaultUser”。

允许localUser订阅组中的所有本地内容。

根据小组的ID,我也会发布一些内容。

问题是:订阅不会重新订阅。

工作流程:

  1. 用户访问应用
  2. 调用meteor-method获取默认角色
  3. 获取默认角色
  4. 订阅出版物
  5. 如果用户具有正确的角色,则发布(完整组)发布内容
  6. 我的出版物如下:

    Meteor.publish "thisGroupPublic", (id) ->
        return db.groups.find({_id: id}, {fields: {onlypublicones...}}
    
    Meteor.publishComposite "thisGroupReactive", (id) ->
        return {
            find: () ->
                if !Roles.userIsInRole(@userId, "defaultUser", id)
                    @ready()
                    console.log("[thisGroupReactive] => No Rights")
                    return;
    
                return db.groups.find({_id: id});
    
            children: [
                {
                    find: (group) ->
                        return db.contents.find({groups: {$in: [group._id]}}, {fields: {apikey: 0}})
                }
            ]
        }
    

    当用户在登录页面上时,用户订阅订阅“thisGroupPublic”,并在作为登录用户首次访问该组时获得角色“defaultUser”。但是我如何配置iron:router 重新订阅此订阅,显示内容,而不仅仅是公共内容?

1 个答案:

答案 0 :(得分:1)

假设用户在路线/something

您有一些数据发生了变化,您创建了一个会话变量:

Session.set("someDataThatChanges", myChangedData)

您的发布函数需要某种输入,它用于从集合中返回不同的数据:

Meteor.publish("myCollection", function(input){

  return myCollection.find( 
    // do something here based on 'input' 
  );

});

Iron Router有一个.subscribe方法,与Meteor.subscribe相同,也是一个subscriptions密钥,它接受一个函数。您可以在Tracker.autorun周围包裹.subscribe并输入会话变量,以根据该会话变量的更改值自动重新订阅某些内容。

Router.route("/something", {

  name: "templateName",

  // a place to put your subscriptions
  subscriptions: function() {

    console.log("this in router ", this);

    Tracker.autorun(function(){
      this.subscribe('myCollection', Session.get("someDataThatChanges");
    });

  },

});