Backbone.js获取谷歌地图的问题

时间:2012-10-14 11:25:33

标签: backbone.js backbone-events

使用骨干我将从Google地图中获取结果,以返回用户所在地点的标记。结果填充了一个集合,每当用户移动地图时我就会根据新的位置边界进行新的提取(我使用谷歌地图空闲事件来获取此信息并更改集合的URL)。

要管理标记,我会使用每个标记填充数组。

我遇到的问题是我得到了第一组标记但是当移动地图时它不会写入任何新标记,而当你检查标记数组时它与上一个结果相同。如果我进行AJAX调用,我会得到所需的结果,但是我希望将这一切保留在主干集合中,因为我在模型中执行其他过程。

/* Tracking Page Items */
var allPlace = Backbone.Model.extend({

    createMarker:function(){      

        var marker = new google.maps.Marker({
            position: this.getLatLng(),
            title: this.get("name"),        
            location_type: this.get("type")
        });

        return marker;       

    }

});

var MarkersCollection = Backbone.Collection.extend({

    model: allPlace,

    url:function(){                   
        return '/'
    }

})

var markersArray = [];
var mapAll = Backbone.View.extend({

    initialize: function() {
        _.bindAll(this, 'render', 'createMarkers'); // get access to this in other methods
        this.collection.bind('reset', this.render, this);
    },

    render: function() {

    // Load map scripts and initialise
        if(typeof google === "undefined"){
            nzp.loadGoogleMap();
        } else {
            nzp.initializeMap();
        };

    // Current location                 
        myLocations = {
            lat: this.collection.lat,
            lng: this.collection.lng
        };


    // Listen for map movement
        var self = this;
        google.maps.event.addListener(map, 'idle', function() {
            var bounds = map.getBounds();   
            var lat1 = bounds.ca.b;             
            var lng1 = bounds.ea.b;
            var lat2 = bounds.ca.f;
            var lng2 = bounds.ea.f;         
            self.showMarkers(lat1, lng1, lat2, lng2);
            });
        },

    // update URL based on new bround   
        showMarkers: function(lat1, lng1, lat2, lng2) {

            var markerCollection = new MarkersCollection;
            nzp.infoWindow = new google.maps.InfoWindow();

            lat = myLatlng.Xa;
            lng = myLatlng.Ya;
            lat1 = lat1;
            lng1 = lng1;
            lat2 = lat2;
            lng2 = lng2;

            // Collection URL build from parameter adn current location
                markerCollection.url = "http://blah.com/locator/api/locations?api_key=XXX&nearby_latitude="+lat+"&nearby_longitude="+lng+"&lat1="+lat1+"&lng1="+lng1+"&lat2="+lat2+"&lng2="+lng2+"&max=10&format=jsonp&callback=?";     

            // Fetch collection
            markerCollection.fetch({

                success: function(results) {

                    // Clear the markers array
                    for (i in markersArray) {
                        markersArray[i].setMap(null);
                    }
                    markersArray.length = 0;

                    // Loop over items in collection

                    results.map(function(item){

                        var marker = item.createMarker();
                        marker.setMap(map);

                        // Create a marker based on each item
                        (function(marker, item) {

                            google.maps.event.addListener(marker, "click", function(e) {
                            nzp.infoWindow.setContent(infowindowContent(item)); // Info window content is processed in a method within the model 
                            nzp.infoWindow.open(map, marker);
                            });             

                            // Place each marker in the markers arrya
                                markersArray.push(marker); // Push markers into an array so they can be removed

                        })(marker, item);

                    }, this);
                }
            });

            // Set markers to vidsible
                $.each(markersArray, function(index, item){         
                    markersArray[index].setVisible(true);
                });

});

1 个答案:

答案 0 :(得分:0)

修正了此问题。问题与传递给API的值有关,而不是我如何更新集合URL。

我正在传递一个边界和一个当前位置和边界,这导致API始终返回相同的结果。我在代码中使用的AJAX版本在URL中有一个拼写错误,实际上允许API返回正确的结果。