Meteor子模板调用中如何传递Spacebars变量作为Google Maps名称?
解决Meteor中动态传递ID给dburles Google Maps的问题
我来帮你搞定这个问题!你遇到的其实是Spacebars模板语法的一个小误区,导致动态ID没有被正确传递给地图实例。
问题根源
你在调用googleMap模板时,错误地给name属性套了一层额外的{{}}:
{{> googleMap name="{{post._id}}" options=MapOptions}}
这种写法会把字符串{{post._id}}直接传给地图的name参数,而不是post._id的实际值。这样一来,GoogleMaps.ready监听的是错误的名称,自然不会触发回调函数。
修正方案
只需要去掉name属性里的嵌套大括号,直接引用变量即可:
修正后的HTML代码
<template name="Example"> {{#each post in posts}} {{> ExampleDetail post=post }} {{/each}} </template> <template name="ExampleDetail"> {{> googleMap name=post._id options=MapOptions}} </template>
确认JavaScript代码
你的onCreated逻辑是正确的,不过可以补充确保MapOptions helper返回合法的配置(避免其他潜在问题):
Template.ExampleDetail.onCreated(function() { GoogleMaps.ready(this.data.post._id, function(map) { console.log("IT WORKS!"); }); }); Template.ExampleDetail.helpers({ MapOptions: function() { return { center: new google.maps.LatLng(37.7749, -122.4194), // 示例坐标,可根据需求修改 zoom: 10 }; } });
原理说明
在Spacebars中,给模板属性传递变量时,直接写变量名即可(比如name=post._id),Spacebars会自动解析变量的实际值。如果额外添加{{}},就会被当作普通字符串处理——这就是你用固定字符串能生效,但动态变量不行的核心原因。
修正后,GoogleMaps.ready就能正确监听对应post._id的地图实例,控制台应该就能正常输出"IT WORKS!"了。
内容的提问来源于stack exchange,提问作者elCamilet
相关产品推荐
相关产品推荐

