Как заставить Meteor.Call возвращать значение для шаблона?

StackOverflow https://stackoverflow.com//questions/10677491

  •  12-12-2019
  •  | 
  •  

Вопрос

я пробовал чтобы понять этот пост относительно этой концепции, однако, я не могу этого понять.У меня есть следующая простая настройка:

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

Эта структура возвращается на консоль undefined.

Если я изменю myapp.js файл в:

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

я получаю Object в моей консоли.

В идеале это то, что я хотел бы сделать, но это не работает, заявив в консоли: Cannot read property 'greeting' of undefined

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

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

Будем очень признательны за любую помощь в передаче данных из объекта сервера в шаблон.Я все еще изучаю JavaScript и Meteor.

Спасибо!

Это было полезно?

Решение

От тот Meteor.call документация:

На клиенте, если вы не передаете обратный вызов и не находитесь внутри заглушки, вызов вернет неопределенное значение, и у вас не будет возможности получить возвращаемое значение метода.Это связано с тем, что у клиента нет волокон, поэтому он фактически не может заблокировать удаленное выполнение метода.

Итак, вы захотите сделать это следующим образом:

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

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

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

Это приведет к реактивному обновлению шаблона, как только данные станут доступны.

Другие советы

Это происходит потому, что Npm.require имеет асинхронное поведение.Вот почему вам нужно написать обратный вызов для Meteor.call.

Но есть решение, просто используйте install(mrt add npm) и вы получите функцию с именем Meteor.sync(//...) с этим вы можете сделать обе игры:синхронизация и асинхронность в вашем Meteor.call().

Ссылка: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/

Вы можете получить возвращаемое значение метода Meteor для использования в шаблоне, используя реактивная переменная.Проверьте рабочая демонстрация на Метеорпаде

Я пошел за решением проблемы гетто.Но это работает для меня, и это главное для меня.Ниже приведен мой код, который, я думаю, теоретически решает проблему ОП.

В файле main.js клиента:

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

}, 5000); 

При этом функция подтверждения входа() будет запускаться каждые пять секунд.

Функция submitLogin (в файле main.js клиента):

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

}

Метод loggedIn (в файле main.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;
},

Соответствующий помощник:

loggedIn: function () {
    return Session.get("loggedIn");
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top