使用Meteor.call加载数据

使用Meteor.call加载数据,meteor,Meteor,尝试呈现模板时,我希望从服务器加载数据。我正在尝试使用Meteor.call,但根据文档,我显然不在存根中 如果我在事件处理程序中使用Meteor.call,我得到的响应是正确的。如果我在template.created或类似的函数中调用它,我会得到一个未定义的响应。我想我可以使用异步调用来完成它,然后在可用时呈现它。但还有别的办法吗 我不希望客户端直接访问数据库,我希望它来自服务器 //This doesn't work Template.config.created = functi

尝试呈现模板时,我希望从服务器加载数据。我正在尝试使用Meteor.call,但根据文档,我显然不在存根中

如果我在事件处理程序中使用Meteor.call,我得到的响应是正确的。如果我在template.created或类似的函数中调用它,我会得到一个未定义的响应。我想我可以使用异步调用来完成它,然后在可用时呈现它。但还有别的办法吗

我不希望客户端直接访问数据库,我希望它来自服务器

  //This doesn't work
  Template.config.created = function() {
    console.log(Meteor.call('getValue')); //returns undefined
  };

   //This works
   Template.config.events({
    'blur #button' : function () {
      console.log(Meteor.call('getValue')); //Prints value
    }
有什么线索吗

D从文件中:

在客户端上,如果不传递回调且不在存根中,
call
将返回
undefined
,您将无法获取方法的返回值。这是因为客户端没有光纤,所以实际上没有任何方法可以阻止方法的远程执行

我不知道你的事件处理程序调用为什么起作用。。。在没有光纤的JavaScript中,没有任何方法可以同步获得这样的服务器响应。解决方案只是提供一个异步回调。这不是Meteor的限制,只是JavaScript的限制。

来自文档:

在客户端上,如果不传递回调且不在存根中,
call
将返回
undefined
,您将无法获取方法的返回值。这是因为客户端没有光纤,所以实际上没有任何方法可以阻止方法的远程执行


我不知道你的事件处理程序调用为什么起作用。。。在没有光纤的JavaScript中,没有任何方法可以同步获得这样的服务器响应。解决方案只是提供一个异步回调。这实际上不是Meteor限制,只是JavaScript限制。

您需要在Meteor.call中使用回调

Template.config.created = function() {
    Meteor.call('getValue', function(error, data) {
        if(error){
            //do stuff to handle error
        }
        console.log(data);
    });
};

您需要在Meteor.call中使用回调

Template.config.created = function() {
    Meteor.call('getValue', function(error, data) {
        if(error){
            //do stuff to handle error
        }
        console.log(data);
    });
};


另一个注意事项是,在Meteor中,客户端实际上从未直接访问数据库,即使在使用客户端DB API时也是如此。将根据您指定的允许/拒绝规则检查所有查询。这使您能够完全控制允许客户端运行的查询。至少,你应该在客户端上定义方法存根,这样它可以进行延迟补偿,与等待服务器方法响应相比,让你的应用程序感觉不那么迟钝。添加到Cuberto——默认情况下Meteor已启用自动发布和不安全,它将所有数据发布到所有客户端,并允许客户端完全访问。您可以使用$meteor remove关闭这些功能,并发布/订阅所需的数据。这里有一篇相当不错的文章:下面的两个答案很贴切。以上的澄清也是如此。多亏了这些帮助。另一个值得注意的是,在Meteor中,客户端实际上从未直接访问数据库,即使使用客户端DB API也是如此。将根据您指定的允许/拒绝规则检查所有查询。这使您能够完全控制允许客户端运行的查询。至少,你应该在客户端上定义方法存根,这样它可以进行延迟补偿,与等待服务器方法响应相比,让你的应用程序感觉不那么迟钝。添加到Cuberto——默认情况下Meteor已启用自动发布和不安全,它将所有数据发布到所有客户端,并允许客户端完全访问。您可以使用$meteor remove关闭这些功能,并发布/订阅所需的数据。这里有一篇相当不错的文章:下面的两个答案很贴切。以上的澄清也是如此。感谢所有的帮助。谢谢,我一直都很胖。很明显,只是需要一些时间远离屏幕!谢谢,我太胖了。很明显,只是需要一些时间远离屏幕!谢谢你明确的回答。我是否应该设置反应性,以便在调用完成时更新模板?通常会这样做。最简单也是最常见的方法是在回调函数中执行
Session.set()
,在模板帮助器函数中执行
Session.get()
。我建议设置一个返回集合的模板帮助器(默认情况下是被动的)——请参阅关于“模板帮助器”的部分。否则使用会话(库贝托的建议对你有用)@hharnisc是的,如果没有更多关于方法实际作用的信息,很难判断OP需要哪种方法。还应该提到的是,组合方法通常很有用,其中会话变量用作辅助函数的
find()
调用的选择器的一部分。谢谢大家。现在与Session配合得很好。在template.created中,我启动呼叫,然后设置会话,然后在我的助手中获取会话。感谢您的明确回答。我是否应该设置反应性,以便在调用完成时更新模板?通常会这样做。最简单也是最常见的方法是在回调函数中执行
Session.set()
,在模板帮助器函数中执行
Session.get()
。我建议设置一个返回集合的模板帮助器(默认情况下是被动的)——请参阅关于“模板帮助器”的部分。否则使用会话(库贝托的建议对你有用)@hharnisc是的,如果没有更多关于方法实际作用的信息,很难判断OP需要哪种方法。还应该提到的是,组合方法通常很有用,其中会话变量用作辅助函数的
find()
调用的选择器的一部分。谢谢大家。现在与Session配合得很好。在template.created中,我启动呼叫,然后设置会话,然后在助手中获取会话。