【问题标题】:Setting a result returned from rest api to a template variable in Meteor将rest api返回的结果设置为Meteor中的模板变量
【发布时间】:2014-01-04 06:12:18
【问题描述】:

我正在学习如何使用 Meteor,我正在尝试连接到 google map api 并返回 json 使用meteor.http.get。下面的代码工作正常,我可以设置模板变量test等于返回的json并查看它(我现在想用它来学习):

if (Meteor.isServer) {
    Meteor.methods({
        getGoogleMaps: function () {
            this.unblock();
            return Meteor.http.call("GET", "http://maps.googleapis.com/maps/api/geocode/json",
                {params:{address:"8-10 Broadway, London SW1H 0BG,United Kingdom",
                    sensor:false}});
        }
    });
}

if (Meteor.isClient) {
    Template.main.test=function(){ return Session.get("response");}
    Meteor.call("getGoogleMaps", function(error, results) {
        Session.set("response", results.content); 
   });
}

但是以下将返回的json分配给测试模板变量的方法不起作用:

if (Meteor.isClient) {
    var response;

    Meteor.call("getResponses", function(error, results) {
            response= results.content;         
    });  

   Template.main.test=function(){ return response;}
}

这也不起作用:

if (Meteor.isClient) {
    Meteor.call("getResponses", function(error, results) {
            Template.main.test= results.content;        
    });  
}

为什么最后两种方法不起作用?从rest api返回的结果中设置模板变量的最合适方法是什么?

【问题讨论】:

标签: javascript rest meteor


【解决方案1】:

第二种方法设置值,但是当从服务器接收到响应时,客户端已经呈现了模板,因此您看不到结果。这种时间问题是刚开始使用异步 javascript 时的常见问题,也是 Meteor 的响应性如此吸引人的主要原因之一。

第三种方法与第二种方法有相同的时间问题,但它也将模板助手设置为非函数值,因此无效。

由于 Meteor 的反应性,第一种方法可以正常工作。这一行:

Template.main.test=function(){ return Session.get("response");}

...注册对 Session.get('response') 的依赖。当最终从服务器接收到响应时,对 Session.set('response') 的调用会触发所有依赖项的重新计算,以便使用接收到的值再次呈现模板。

您可以通过执行以下操作更明确地看到这一点:

if (Meteor.isClient) {

  Template.main.rendered = function () {
    console.log('[main] rendered');
  };

  Template.main.helpers({
    test: function () { 
      console.log("[main] 'test' helper executed");
      return Session.get("response");
    }
  });

  Meteor.call("getGoogleMaps", function(error, results) {
    console.log("[main] response received");
    Session.set("response", results.content); 
  });
}

【讨论】:

  • 感谢您的详尽解释,上面的代码确实有助于理解这一点
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 2022-12-18
  • 2013-09-27
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
相关资源
最近更新 更多