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!

Était-ce utile?

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");
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top