如何让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。
谢谢!
从Meteor.call
文档 :
在客户端,如果你没有传递一个callback,而你又不在一个存根内,那么调用将返回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; };
一旦数据可用,这将会被动更新模板。
发生这种情况是因为Npm.require
具有asynchronous行为。 这就是你必须为Meteor.call
写一个callback的Meteor.call
。
但是有一个解决scheme,只需使用install(mrt add npm)
,你将得到一个名为Meteor.sync(//...)
的函数,你可以在Meteor.call()
。
参考: http : //www.sitepoint.com/create-a-meteor-app-using-npm-module/
您可以通过使用无功variables来获取Meteor方法在模板中使用的返回值。 检查Meteorpad上的工作演示
我去了贫民窟解决scheme。 但是,这对我来说很重要,这对我来说很重要。 下面是我的代码,我认为这个代码解决了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"); }