谷歌地图与流星不工作

cha*_*hne 2 javascript google-maps-api-3 meteor

对于我的项目,我需要谷歌地图API.我只是可以通过脚本标签服务api,所以我尝试了类似的东西.

我的HTML:

<head>
  <title>app</title>
  <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">    </script>
</head>

<body>
  {{> hello}}
</body>

<template name="hello">
  <div id="map-canvas"/>
</template>
Run Code Online (Sandbox Code Playgroud)

我的js:

if (Meteor.isClient) {

  var mapOptions = {
      center: new google.maps.LatLng(-34.397, 150.644),
      zoom: 8,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };

  var map = new google.maps.Map(document.getElementById("map-canvas"),
            mapOptions);    
}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
  });
}
Run Code Online (Sandbox Code Playgroud)

执行时错误是:未捕获的ReferenceError:未定义谷歌

我怎样才能使这个工作?

Aks*_*hat 6

流星脚本通常在加载谷歌地图API之前运行,因此最好将您的代码放入Template.rendered:参见流星文档中的Template.rendered

例如,如果你有一个模板

<template name="maps">
    <div id="map-canvas"></div>
</template>
Run Code Online (Sandbox Code Playgroud)

你的js将是:

Template.maps.rendered = function() {
    var mapOptions = {
        center: new google.maps.LatLng(-34.397, 150.644),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById("map-canvas"),
        mapOptions);   
}
Run Code Online (Sandbox Code Playgroud)

这实际上更多地取决于模板的外观.每当模板发生反应性更改时,渲染的回调将重新运行.因此,如果您发现它重新渲染,您可能必须使用Session哈希来检查它,它只设置一次地图中心/设置.

另一个选择是将地图居中代码放入Meteor.startup(function() { ... });,但这又取决于您的模板结构,因为地图需要在第一个模板上可见而不是另一个页面(因为div元素不会出现在屏幕上)

  • 使用.created方法而不是.rendered只执行一次任务 (3认同)