【问题标题】:Google Maps load API script and initialize inside ember.js viewGoogle Maps 加载 API 脚本并在 ember.js 视图中初始化
【发布时间】:2013-06-12 21:01:07
【问题描述】:

我正在尝试为 Google 地图创建 Ember 视图,并以按需方式加载脚本,即异步加载 API。

我在视图中有两个函数,一个用于加载 Google Maps API,另一个用于初始化地图。但是由于谷歌要求我通过需要API的链接调用回调函数。但是在 Ember.JS 中,我无法得到正确的结果。我得到的只是一条错误消息,指出在尝试初始化地图时对象“google”未定义。

这里是 Ember 视图代码。

App.MapsView = Ember.View.extend({

templateName: 'maps',
map: null,

didInsertElement: function() {
    this._super();
    this.loadGoogleMapsScript();
},

initiateMaps:function(){
    var mapOptions = {
        zoom: 8,
        center: new google.maps.LatLng(-34.397, 150.644),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(this.$().get(0), mapOptions);
    this.set('map',map);
},

loadGoogleMapsScript: function(){
    var map_callback = this.initiateMaps();

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=map_callback';
    document.body.appendChild(script);
},

});

任何想法如何解决这个回调问题?而且,初始化地图的最佳方式是什么?它应该在模板中还是来自 JS?

提前致谢。

【问题讨论】:

  • 已经解决了问题,在此做笔记,以防有人遇到同样的问题。应声明回调函数并将其绑定到窗口对象。请参见下面的代码: window.map_callback = function(){ self.initialize(); } 它有效...

标签: javascript google-maps callback ember.js


【解决方案1】:

这里有两个问题。一个是你在这一行调用你的initiateMaps()函数:

var map_callback = this.initiateMaps();

此调用在 Maps API 加载之前进行,导致未定义的google 错误。

另一个问题是map_callback 是这个函数的本地函数。 Maps API 脚本 URL 中使用的回调必须是全局函数。

(您自己解决了这个问题;我只是为了方便未来的访问者而将其添加到此处。)

解决这两个问题的方法是将该行更改为:

var self = this;
window.map_callback = function() {
    self.initiateMaps();
}

可能有一种更“本机”的 Ember 方法可以做到这一点,但无论如何这应该可以解决问题。

另外,由于您使用 jQuery 和 Ember,您可以替换以下代码:

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=map_callback';
document.body.appendChild(script);

与:

$.getScript( 'https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=map_callback' );

【讨论】:

  • 谢谢迈克尔!我试过了,但仍然出现错误。它说“Uncaught TypeError: Object # has no method 'map_callback'”。我认为这是因为当它调用 $.getScript 时,回调将绑定到 Window 对象并导致该错误。任何想法如何解决它?
  • 我想通了!它可以通过将回调函数附加到窗口对象来工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多