【问题标题】:Return doesnt display from meteor helper when I use Meteor.call当我使用 Meteor.call 时,流星助手不显示返回
【发布时间】:2015-05-07 08:57:55
【问题描述】:

返回值正在控制台中打印。但它不显示在模板中

我的模板

<template name="Mytemplate">
<ul>
   {{#each Name}}
      <li>{{this}}</li> //No display
   {{/each}}
</ul>
</template>

js

Template.Mytemplate.helpers({
  Name : function(){
    Meteor.call("getnNames", function(error, result) {
      if(error){
        alert("Oops!!! Something went wrong!");
        return;
      }else{
       console.log(result); // Got result in array ["john","smith"]
       return result;
      }
    });
  }

});

我的回报是对的吗?或者怎么做?

【问题讨论】:

  • 从这段代码中,它应该可以工作。一定有其他我们看不到的事情发生。
  • 重点是,您不能在模板助手中调用服务器方法。我的意思是你可以,但不会在模板上得到输出,这几乎违背了目的。有几个解决方法。看看this question and answers
  • 永远不要从帮助程序更改您的“应用程序状态”(例如设置会话或调用方法)。助手是表示当前数据状态的一种方式。

标签: javascript meteor meteor-helper


【解决方案1】:

Meteor.call 不会返回模板内的任何内容。在call 函数中,您返回结果,但调用本身不会返回任何内容。

来自Meteor Docs

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

但是,您可以将 result 放入 Session 变量中并以反应方式返回。

【讨论】:

  • 我同意第一部分但不同意最后一部分。 客户端中调用的meteor.method执行是一个模拟。这确实意味着您不应该拿走任何东西并改变“应用程序状态”。不知何故,它是“危险的”。无论如何,问题代码也是不正确的,因为他正在从助手调用方法(这是错误的)。
【解决方案2】:

因为方法调用是异步的,所以无法知道返回值何时实际返回。这意味着帮助程序通常会在您的方法调用之前完成。您必须了解在客户端上运行 Meteor.call 是非阻塞的,因此您的助手将继续执行并在返回值从服务器返回之前结束。可能您以错误的方式解决问题,但正如其他人所说,您可能做的最好的事情是不要从帮助程序返回,而是将其插入反应数据源,如反应变量、会话甚至客户端集合,然后从其他地方被动地访问它。

【讨论】:

    【解决方案3】:

    客户端上的方法调用是异步的,您不能从异步函数返回值。解决方法是使用reactive variableSession

    Template.Mytemplate.helpers({
      Name: function() {    
        Meteor.call("getnNames", function(error, result) {
          if (error) {
            alert("Oops!!! Something went wrong!");
          } else {
            console.log(result); // Got result in array ["john","smith"]
            Session.set('names', result);
          }
        });
        return Session.get('names');
      }
    });
    

    【讨论】:

    • 永远不要设置会话或从助手调用方法。
    • 告诉我为什么我不应该在一个简单的应用程序中使用 Session 而不是 ReactiveVar...
    • 我没说过。我说过你不能在助手中设置会话(或调用方法)。帮助器只是表示应用程序当前数据状态的一种方式,如果您更改它(例如设置会话),那么您做错了。
    • 在您的代码中,每次执行您的助手时,您都会调用一个方法。然后该方法将设置一个会话。在这种情况下,您可能会遇到循环,并且在最好的情况下,您调用该方法的次数不止一次。实现相同执行的最佳方法是将 Meteor.call 移动到 onCreated (例如)。但是,我仍然不同意您实现想要获得的行为的方式(无论如何,这取决于您想要做什么)。
    猜你喜欢
    • 2019-02-10
    • 2017-01-10
    • 2016-12-07
    • 2014-07-03
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多