繁体   English   中英

如何让Meteor.Call返回模板的值?

[英]How to get Meteor.Call to return value for template?

我试图理解这个关于这个概念的帖子 ,但是,我没有得到它。 我有以下简单的设置:

/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文档

在客户端上,如果您没有传递回调并且您不在存根中,则调用将返回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具有异步行为。 这就是你必须为Meteor.call编写回调的Meteor.call

但是有一个解决方案,只需使用install(mrt add npm) ,你就可以得到一个名为Meteor.sync(//...)的函数,你可以做两个游戏:在你的Meteor.call()同步和异步。

参考: http//www.sitepoint.com/create-a-meteor-app-using-npm-module/

您可以使用反应变量获取Meteor方法的返回值,以便在模板中使用。 查看Meteorpad工作演示

我去了一个贫民窟解决方案。 但是,它对我来说很重要,这对我来说很重要。 下面是我的代码,在概念上,我认为,它解决了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");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM