我正在学习如何使用Meteor,我正在尝试连接到谷歌地图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返回的结果设置模板变量的最合适的方法是什么?
答案 0 :(得分:2)
第二种方法设置值,但是当从服务器收到响应时,客户端已经渲染了模板,因此您没有看到结果。这种计时问题是第一次开始使用异步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);
});
}