我在以下骨干视图中遇到了一个问题,即呈现谷歌街景。
问题是在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);
}
},
});
答案 0 :(得分:1)
您有几个选择。您可以使用_.bindAll
将processSVData
绑定到相应的this
:
initialize: function() {
_.bindAll(this, 'processSVData');
//...
}
这将使this
始终成为processSVData
内的视图。
您也可以仅使用_.bind
进行回调:
sv.getPanoramaByLocation(this.latLng, 50, _.bind(this.processSVData, this));
这将确保this
作为this.processSVData
回调调用sv.getPanoramzByLocation
时的视图。您可以使用$.proxy
或Function.bind
执行类似的操作(如果您不必担心浏览器版本问题)。
或者你可以用通常的jQuery样式手工完成:
var _this = this;
sv.getPanoramaByLocation(this.latLng, 50, function(data, status) {
_this.processSVData(data, status);
});
第一个_.bindAll
可能是Backbone中最常用的方法。