街景和主干变量范围
street view and backbone variable scoping
我在以下呈现谷歌街景的主干视图中遇到了问题。
问题是在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);
}
},
});
你有几个选择。您可以使用_.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中最常见的方法。
相关文章:
- js命名空间和变量范围
- 如何确保变量范围在这个循环中得到维护
- 在两个浏览器选项卡之间共享变量范围
- 文件API中的Javascript变量范围
- javascript和jQuery的嵌套对象函数中的变量范围
- JavaScript 函数变量范围问题
- JavaScript 中变量范围的问题
- Javascript - 揭示对象和变量范围
- 主干.js(具有 Require.js)变量/范围访问问题
- Javascript 变量范围未定义
- 如何绕过javascript变量范围
- IE 8变量范围错误
- 了解 Javascript 变量范围
- 控制变量范围
- 函数之间的Javascript变量范围问题
- 这种减少if语句中声明的变量范围的模式是一种好的做法吗
- 用于未初始化的局部变量的javascript变量范围
- 变量范围
- 请求节点模块变量范围
- Javascript 和 JQuery dom 全局变量范围