2

我有一个backbone.js 模型。我想从该模型的方法中加载谷歌地图 API javascript。我不想将脚本加载到文档的开头。

我可以使用 $.getScript() 加载 js 然后显示地图吗?但是当我指定回调函数 http://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=TRUE&callback=initialize

我总是得到一个错误,因为我不想定义一个全局 js 函数 initialize()。我希望回调方法是相同的backbone.js 模型的方法。

App = Backbone.Model.extend({
construct  : function(),
displayMap : function()
{
    $.getScript("http://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=TRU&callback=initialize", function(data, textStatus, jqxhr) {

    console.log('Load was performed.');
    });
},
initialize: 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(document.getElementById("map-canvas"), mapOptions);
}

});

var App = new App();
App.displayMap();
4

1 回答 1

6

试试这个结构的地图模型:

Map = Backbone.Model.extend({
    defaults: {
        id: '', currentLatLng: {}, mapOptions: {}, map: {},
        position: {}, zoom: 13, maxZoom: 16, minZoom: 12
    },
    initMap: function(position){
        this.set('position', position);
        var currentLatLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
        this.set('currentLatLng', currentLatLng);
        var mapOptions = {
            zoom: this.get('zoom'),
            minZoom: this.get('minZoom'),
            maxZoom: this.get('maxZoom'),
            center: currentLatLng,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControl: false
        };
        this.set('mapOptions', mapOptions);
    }
});

此代码用于查看:

MapView = Backbone.View.extend({
    defaults:{
       region: 'us', language: 'en'
    },
    id: 'gmaps-container',
    className: 'gmaps_container',
    initialize: function(){
       var url = "http://maps.googleapis.com/maps/api/js?key=key_here&sensor=false";
       $.ajax({
           url: url,
           dataType: "script",
           async: false,
           success: function(){
               console.log('script loaded');
           }
       });
       this.model.set('map', new google.maps.Map(this.el, this.model.get('mapOptions')));
    },
    render: function(){
        console.log('init map');
        $('#' + this.id).replaceWith(this.el);
        return this;
    }
});

只需在主脚本中初始化模型和视图:

    var map = new Map({zoom: 8, maxZoom: 18, minZoom: 8});
    map.initMap({coords: {latitude: -34.397, longitude: 150.644}});
    var mapView = new MapView({model: map});
    mapView.render();

您还需要简单的 html 容器:

<div id="gmaps-container" class="gmaps_container"></div>

注意:设置容器的宽度和高度。

于 2013-08-20T14:52:33.867 回答