3

我有一个视图,其中包含可通过视图范围内的this.map访问的谷歌地图。世界上一切都很好。

接下来我想通过我视图中的事件来更新地图位置。为此,我接受文本输入,使用 google.maps.Geocoder.geocode(),然后通过以下方式更新位置:

setMapLocation:函数(位置){

    _.bind(this.setMapLocationCallback, this);

    console.log(this);

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'address': location}, this.setMapLocationCallback);

},

此处的console.log(this)向我展示了视图的范围,并且this.map可以正确访问。请注意,我在这里明确地将回调绑定到 this。这是回调:

setMapLocationCallback: function (results, status) {

    console.log('this in the callback');
    console.log(this);

    if (status == google.maps.GeocoderStatus.OK) {
        this.map.setCenter(results[0].geometry.location);
        var marker = new google.maps.Marker({
            map: this.map,
            position: results[0].geometry.location
        });
        this.mapCanvas.css({visibility: 'visibile'});
    } else {
        this.mapCanvas.css({visibility: 'hidden'});
    }
},

问题是,在回调console.log(this)内部,即使我将它明确地绑定到视图对象的this 范围,它也显示它范围是Window 对象。

我需要在回调中访问 this.map,因为我可能在一个页面上拥有多个地图,并且需要区分我在说哪一个。

如何将此回调绑定到正确的范围?或者,有没有更好的方法来做到这一点?

我正在使用backbonejs 和underscorejs,但这应该是一个相当普遍的问题。

在此先感谢,大卫

4

1 回答 1

5

尝试改变

 geocoder.geocode({'address': location}, this.setMapLocationCallback);

using call(),所以你可以改变thisinside的范围setMapLocationCallback

 var _this = this;
 geocoder.geocode({'address': location}, function(result, status) {
     _this.setMapLocationCallback.call(_this, result, status);
 });

关于 call() 函数的 MDN 文档

于 2012-05-09T12:56:11.253 回答