街景和骨干变量范围

时间:2012-06-16 02:06:59

标签: javascript google-maps google-maps-api-3 backbone.js

我在以下骨干视图中遇到了一个问题,即呈现谷歌街景。

问题是在processSVData函数中,this不是App.DetailStreetView的实例。当我在console.log(this)processSVData()时,我会得到DOMWindow个对象。因此,在尝试访问this.panorama时,我会undefined

App.DetailStreetView = Backbone.View.extend({
    initialize: function() {
        this.latLng = new google.maps.LatLng(37.869085,-122.254775);
        this.panorama = new google.maps.StreetViewPanorama(this.el);
    },
    render: function() {
        var sv = new google.maps.StreetViewService();
        sv.getPanoramaByLocation(this.latLng, 50, this.processSVData);        
    },
    processSVData: function(data, status) {
        if (status == google.maps.StreetViewStatus.OK) {
            // calculate correct heading for POV
            //var heading = google.maps.geometry.spherical.computeHeading(data.location.latLng, this.latLng);
            this.panorama.setPano(data.location.pano);
            this.panorama.setPov({
                heading: 270,
                pitch:0,
                zoom:1, 
            });
            this.panorama.setVisible(true);
        }
    },
});

1 个答案:

答案 0 :(得分:1)

您有几个选择。您可以使用_.bindAllprocessSVData绑定到相应的this

initialize: function() {
    _.bindAll(this, 'processSVData');
    //...
}

这将使this始终成为processSVData内的视图。

您也可以仅使用_.bind进行回调:

sv.getPanoramaByLocation(this.latLng, 50, _.bind(this.processSVData, this));

这将确保this作为this.processSVData回调调用sv.getPanoramzByLocation时的视图。您可以使用$.proxyFunction.bind执行类似的操作(如果您不必担心浏览器版本问题)。

或者你可以用通常的jQuery样式手工完成:

var _this = this;
sv.getPanoramaByLocation(this.latLng, 50, function(data, status) {
    _this.processSVData(data, status);
});

第一个_.bindAll可能是Backbone中最常用的方法。