Comment faire en sorte que Meteor.Call renvoie la valeur du modèle ?
Question
J'ai essayé pour comprendre ce post concernant ce concept, cependant, je n'y parviens pas.J'ai la configuration simple suivante :
/server/test.js
Meteor.methods({
abc: function() {
var result = {};
result.foo = "Hello ";
result.bar = "World!";
return result;
}
});
/client/myapp.js
var q = Meteor.call('abc');
console.log(q);
Cette structure revient à la console undefined
.
Si je change le myapp.js
déposer à :
Meteor.call('abc', function(err, data) {
!err ? console.log(data) : console.log(err);
}
je reçois le Object
dans ma console.
Idéalement, c'est ce que j'aimerais pouvoir faire, mais cela ne fonctionne pas, en indiquant dans la console : Cannot read property 'greeting' of undefined
/client/myapp.js
var q = Meteor.call('abc');
Template.hello.greeting = function() {
return q.foo;
}
Toute aide pour transmettre les données de l'objet serveur vers le modèle serait grandement appréciée.J'apprends toujours JavaScript et Meteor.
Merci!
La solution
Depuis le Meteor.call
Documentation:
Sur le client, si vous ne transmettez pas de rappel et que vous n'êtes pas dans un stub, call renverra undefined et vous n'aurez aucun moyen d'obtenir la valeur de retour de la méthode.En effet, le client ne dispose pas de fibres, il n'a donc aucun moyen de bloquer l'exécution à distance d'une méthode.
Donc, vous voudrez procéder comme ceci :
Meteor.call('abc', function(err, data) {
if (err)
console.log(err);
Session.set('q', data);
});
Template.hello.greeting = function() {
return Session.get('q').foo;
};
Cela mettra à jour le modèle de manière réactive une fois que les données seront disponibles.
Autres conseils
Cela arrive parce que Npm.require
a un comportement asynchrone.C'est la raison pour laquelle vous devez écrire un rappel pour Meteor.call
.
Mais il existe une solution, utilisez simplement install(mrt add npm)
et vous obtiendrez une fonction nommée Meteor.sync(//...)
avec cela, vous pouvez faire les deux jeux :synchroniser et asynchrone dans votre Meteor.call()
.
Référence: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/
Vous pouvez obtenir la valeur de retour d'une méthode de météore à utiliser dans un modèle à l'aide d'un variable réactive.Découvrez le Démonstration de travail sur Meteorpad
Je suis allé pour une solution de ghetto.Mais cela fonctionne pour moi, ce qui compte, pour moi.Ci-dessous mon code, qui, dans le concept, je pense, résout le problème de l'OP.
dans le client principal.js:
Meteor.setInterval(function() {
confirmLogin();
}, 5000);
Ceci exécute la fonction ConfirmLogin () toutes les cinq secondes.
la fonction ConfirmLogin (dans le fichier principal du client):
function confirmLogin() {
Meteor.call('loggedIn', function (error, result) {
Session.set("loggedIn", result);
});
}
la méthode de la journalisation (dans le serveur principal.js):
loggedIn: function () {
var toReturn = false;
var userDetails = Meteor.user();
if (typeof userDetails["services"] !== "undefined") {
if (typeof userDetails["services"]["facebook"] != "undefined") {
toReturn = true;
}
}
return toReturn;
},
L'assistant correspondant:
loggedIn: function () {
return Session.get("loggedIn");
}