Как заставить Meteor.Call вернуть значение для шаблона?
Я пробовал чтобы понять этот пост в отношении этой концепции, однако я не могу его получить. У меня есть следующая простая настройка:
/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.
Спасибо!
Ответы
Ответ 1
Из документация Meteor.call
:
На клиенте, если вы не пройдете обратный вызов, и вы не находитесь в заглушке, вызов вернет undefined, и вы не сможете получить возвращаемое значение метода. Это потому, что у клиента нет волокон, поэтому на самом деле он не может блокировать удаленное выполнение метода.
Итак, вы захотите сделать это следующим образом:
Meteor.call('abc', function(err, data) {
if (err)
console.log(err);
Session.set('q', data);
});
Template.hello.greeting = function() {
return Session.get('q').foo;
};
Это будет интерактивно обновлять шаблон после того, как данные будут доступны.
Ответ 2
Это происходит потому, что Npm.require
имеет поведение Async. Это причина, по которой вам нужно написать обратный вызов для Meteor.call
.
Но есть решение, просто используйте install(mrt add npm)
, и вы получите функцию с именем Meteor.sync(//...)
, с помощью которой вы можете выполнять обе игры: синхронизацию и асинхронную синхронизацию в Meteor.call()
.
Ссылка: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/
Ответ 3
Вы можете получить возвращаемое значение метода Meteor для использования в шаблоне с помощью реактивной переменной. Выполните демонстрационную демонстрацию на Meteorpad
Ответ 4
Я пошел на решение гетто. Но это работает для меня, что для меня важно. Ниже мой код, который, по идее, я думаю, решает проблему OP.
В клиенте main.js:
Meteor.setInterval(function() {
confirmLogin();
}, 5000);
Выполняет функцию confirmLogin() каждые пять секунд.
Функция confirmLogin (в файле 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");
}