我正在学习如何使用Meteor,我正在尝试连接到google并使用meteor.http.get.The返回json,下面的代码工作得很好,我可以设置与返回的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返回的结果中设置模板变量最合适的方法是什么?
发布于 2014-01-05 14:06:26
第二个方法设置值,但是当从服务器接收到响应时,客户端已经呈现了模板,因此您看不到结果。当开始使用异步javascript时,这种时间问题是一个常见的问题,它是Meteor的反应性如此吸引人的主要原因之一。
第三种方法与第二种方法具有相同的定时问题,但它也将模板助手设置为非函数值,因此无效。
由于Meteor的反应性,第一种方法的工作方式与您预期的一样。这一行:
Template.main.test=function(){ return Session.get("response");}...registers依赖于Session.get(“响应”)。当最终从服务器接收到响应时,对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);
});
}https://stackoverflow.com/questions/20917660
复制相似问题