2013-12-18 17 views
5

Ich habe das folgende Problem mit Meteor: Ich habe einen Administrator, der alle registrierten Benutzer sehen muss. Aber alle anderen Benutzer sollten die anderen Benutzer nicht sehen können. Deshalb veröffentlichte ich den folgenden Code auf der ServersideMeteor - Veröffentlichen Sie alle Benutzer zu Client nur für Admin

Meteor.publish("adminUsers", function(){ 

    var result; 
    if (Roles.userIsInRole(this.userId, ["admin"])) 
    { 
     result = Meteor.users.find(); 
    } 
    //console.log(result); 
    return result; 
}); 

Auf Client-Seite ich mit

Meteor.subscribe("adminUsers"); 

auf diese abonnieren und tun

AllUsers = new Meteor.Collection("adminUsers"); 

Jetzt habe ich alle Benutzer bekommen in eine Vorlage mit diesem Code:

Template.adminUserverwaltung.AllUsers = function(){ 
console.log(AllUsers.find()); 
return AllUsers.find(); 
} 

und zeigen das Ergebnis in der Vorlage mit diesem Code:

<template name="adminUserverwaltung"> 
    {{#each AllUsers}} 
    {{this.username}} 
    {{/each}} 
</template> 

Aber leider ist es nicht funktioniert ... Kann mir jemand helfen, vielleicht?

Antwort

4

Wenn Sie die Sammlung abonnieren, lautet der Abonnementname adminUsers, aber die Benutzersammlung ist immer noch Meteor.users, die bereits definiert ist.

So ändern nur, dass statt

Template.adminUserverwaltung.AllUsers = function(){ 
    return Meteor.users.find(); 
} 
1

Hier ist zu verwenden, was Sie tun können:

if (Meteor.isClient) { 
    Meteor.subscribe("allUsers"); 
    Template.hello.users = function() { 
    return Meteor.users.find(); 
    } 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    Meteor.publish("allUsers", function(){ 
     var user = Meteor.user(); 
     if (user && user.emails[0].address === '[email protected]'){ 
     return Meteor.users.find(); 
     } 
     return null; 
    }); 
    }); 
} 

Auf diese Weise nur Benutzer [email protected] alle Benutzer sehen. Andere werden nur sich selbst sehen.

In der meteor docs ist ein Beispiel für die Veröffentlichung von benutzerdefinierten Benutzerkollektionen enthalten.

+0

Dies scheint von [meteor.com: Meteor.user()] (http://docs.meteor.com/#/full/meteor_user) davon abgehalten zu werden, "Meteor.user()" nicht zu verwenden in 'Meteor.publish()' – Paul

+0

Es könnte sich seit 2013 geändert haben. ['publish'] (http://docs.meteor.com/#/full/meteor_publish) Die Dokumentation schlägt vor,' this.userId' zu verwenden. – rzymek

+0

Ja, ich fand, dass ich die '_id's für die Admins sammeln und ein globales Array auf der Serverseite für den Vergleich mit' this.userId' füllen musste. Der Versuch, die Eigenschaften der Benutzerdatensätze zu untersuchen, funktionierte für mich innerhalb der Veröffentlichung nicht. – Paul

0

Sie sind fast da ... Diese Antwort verwendet das Meteor-Rollen-Paket als das OP in der Frage gestellt.

Meteor.publish("adminUsers", function(){ 
    var result = []; 
    if (Roles.userIsInRole(this.userId, ["admin"])) { 
     result = Meteor.users.find(); 
    } else { 
     this.stop(); 
     // YOUUU SHALL NOT.... PASS!!! ~Gandalf 
    } 
    return result; 
}); 

Auf Client-Seite, abonnieren Sie dies mit:

Meteor.subscribe("adminUsers"); 

Tun Sie dies nicht tun. Geh weg. Meteor.users ist Ihre Sammlung.

// NOO!! AllUsers = new Meteor.Collection("adminUsers"); 

Jetzt möchte ich mit diesem Code alle Benutzer in einer Vorlage erhalten:

Template.adminUserverwaltung.helpers = { 
    AllUsers: function(){ 
     return Meteor.users.find(); 
    } 
}; 

und zeigen das Ergebnis in der Vorlage mit diesem Code:

<template name="adminUserverwaltung"> 
{{#each AllUsers}} 
    {{this.username}} 
{{/each}} 
</template> 

Und es sollte arbeite jetzt. :)

Verwandte Themen