Pergunta

eu tentei para entender esse post sobre esse conceito, no entanto, não estou conseguindo entender.Eu tenho a seguinte configuração simples:

/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);

Esta estrutura retorna para o console undefined.

Se eu mudar o myapp.js arquivo para:

Meteor.call('abc', function(err, data) {
  !err ? console.log(data) : console.log(err);
}

eu recebo o Object no meu console.

Idealmente, é isso que eu gostaria de poder fazer, mas não funciona, informando no console: Cannot read property 'greeting' of undefined

/client/myapp.js
var q = Meteor.call('abc');

Template.hello.greeting = function() {
   return q.foo;
}

Qualquer ajuda na passagem dos dados do objeto servidor para o modelo seria muito apreciada.Ainda estou aprendendo JavaScript e Meteor.

Obrigado!

Foi útil?

Solução

De o Meteor.call documentação:

No cliente, se você não passar um callback e não estiver dentro de um stub, a chamada retornará indefinido e você não terá como obter o valor de retorno do método.Isso ocorre porque o cliente não possui fibras, portanto não há como bloquear a execução remota de um método.

Então, você vai querer fazer assim:

Meteor.call('abc', function(err, data) {
  if (err)
    console.log(err);

  Session.set('q', data);
});

Template.hello.greeting = function() {
  return Session.get('q').foo;
};

Isso atualizará o modelo de forma reativa assim que os dados estiverem disponíveis.

Outras dicas

Isso acontece porque Npm.require tem comportamento assíncrono.Essa é a razão pela qual você precisa escrever um retorno de chamada para Meteor.call.

Mas existe uma solução, basta usar install(mrt add npm) e você obterá uma função chamada Meteor.sync(//...) com isso você pode fazer os dois jogos:sincronizar e assíncrono em seu Meteor.call().

Referência: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/

Você pode obter o valor de retorno de um método Meteor para uso em um modelo usando um variável reativa.Confira a demonstração de trabalho no Meteorpad

Optei por uma solução de gueto.Mas funciona para mim, e é isso que importa para mim.Abaixo está o meu código, que, em conceito, creio, resolve o problema do OP.

No main.js do cliente:

Meteor.setInterval(function() {
    confirmLogin();

}, 5000); 

Isso executa a função confirmLogin() a cada cinco segundos.

A função confirmLogin (no main.js do cliente):

function confirmLogin() {
    Meteor.call('loggedIn', function (error, result) {
        Session.set("loggedIn", result);
    });

}

O método logado (no main.js do servidor):

loggedIn: function () {
    var toReturn = false;
    var userDetails = Meteor.user();
    if (typeof userDetails["services"] !== "undefined") {
        if (typeof userDetails["services"]["facebook"] != "undefined") {
            toReturn = true;
        }
    }

    return toReturn;
},

O ajudante relevante:

loggedIn: function () {
    return Session.get("loggedIn");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top