2016-09-02 1 views
1

ich Pass-ID haben von html Helfer und mein Helfer GetUserNamewie in Meteor Meteor Anruf Wert in Helfer zurückzukehren

getusername(id) { 
    var username = ""; 
    Meteor.call("getUserName", id, function(error, result) { 
     if (error) { 
      console.log("error", error); 
     } 
     if (result) { 
      console.log(result); 
      username = result; 
     } 
    }); 
    return username; 
} 

während ich das Ergebnis seiner log log, was ich brauche, aber keine Benutzernamen sichtbar in UI. und wenn ich das mit Reactive var verwende, wird es unendlich ... denn wenn ein reaktiver Variablenwert geändert wird, wird er erneut ausgeführt ...

Antwort

1

Wegen des asynchronen Verhaltens bekommst du den Rückgabewert nicht, was du tun kannst, ist der Rückgabewert in der Sitzung und von Sitzung erhalten, wo immer Sie

getusername(id) { 
    var username = ""; 
    Meteor.call("getUserName", id, function(error, result) { 
     if (error) { 
      console.log("error", error); 
     } 
     if (result) { 
      console.log(result); 
      username = result; 
     } 
    }); 
    Session.set('getUserNameResult', result); 
} 
+0

aber wenn ich Session.set nicht verwenden möchten, können Sie –

+0

reaktive Variablen Schauen Sie unten Lösung von @Waiski für mehr Details über reaktive Speicher siehe diesen Link verwenden https://themeteorchef.com/snippets/reactive- dict-reactive-vars-und-sitzungsvariablen/# tmc-reactive-variables –

3

Sie wollen nicht asynchron Daten abrufen können und es aus dem gleichen Helfer zurückkehren, weil die Helfer kehren, bevor der Anruf beendet ist und es keine reaktive Variable, um anzuzeigen, dass die Die Daten haben sich geändert, sobald der Anruf abgeschlossen ist. Sie haben recht mit der Verwendung von ReactiveVar, aber um Endlosschleife zu vermeiden, müssen Sie Meteor.call außerhalb der Vorlage Helper ausführen. Ich würde empfehlen, es in der onCreated Haken der Vorlage zu tun:

Template.x.onCreated(function() { 
    var self = this; 
    Meteor.call("getUserName", this.data.id, function(error, result) { 
    if (result) { 
     self.username = new ReactiveVar(result); 
    } 
    }); 
}); 

Template.x.helpers({ 
    getUserName(id) { 
    return Template.instance().username.get(); 
    } 
}); 

Beachten Sie jedoch, dass in fast allen Fällen ist es besser, Dinge zu tun, wie eine Benutzernamen direkt im Front-End wie return Meteor.users.findOne(id).profile.name oder etwas zu holen, als Das ist reaktiv und einfacher.