Angular4+OpenLayers地图点击事件如何传递组件this上下文
在Angular 4中为OpenLayers点击事件绑定组件实例的
this 这是个很常见的JavaScript上下文绑定问题,OpenLayers的事件回调默认会把this指向地图实例,所以你需要手动把组件的this传递进去。这里有几种简单有效的解决办法:
方法1:使用箭头函数(推荐,最简洁)
箭头函数会自动继承外层作用域的this,也就是你的组件实例,这样在回调里就能直接访问selectedLat和selectedLon了:
// 初始化地图后直接绑定点击事件 this.map = new ol.Map({ layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], target: 'map', view: new ol.View({ center: [2905830.0672892607,5532192.9828046], zoom: 12 }) }); // 用箭头函数作为回调 this.map.on('click', (evt) => { const [lon, lat] = ol.proj.toLonLat(evt.coordinate); this.selectedLon = lon; this.selectedLat = lat; });
方法2:使用bind()绑定上下文
如果你想保留独立的函数定义,可以用bind()把组件的this绑定到回调函数上:
// 组件中定义函数 some_function(evt) { const [lon, lat] = ol.proj.toLonLat(evt.coordinate); this.selectedLon = lon; this.selectedLat = lat; } // 初始化地图后绑定事件时用bind this.map.on('click', this.some_function.bind(this));
方法3:在构造函数中提前绑定函数
这种方式可以避免每次绑定事件时都调用bind(),适合需要多次使用该函数的场景:
constructor() { // 提前把组件的this绑定到函数上 this.some_function = this.some_function.bind(this); } some_function(evt) { const [lon, lat] = ol.proj.toLonLat(evt.coordinate); this.selectedLon = lon; this.selectedLat = lat; } // 初始化地图后直接绑定函数 this.map.on('click', this.some_function);
为什么你之前的写法失败?
你尝试的this.map.on('click',{param1:this},this.some_function)这种方式不生效,是因为OpenLayers的事件监听API不支持这种参数传递方式——它只会把回调函数的this默认设置为地图实例,不会自动解析你传入的参数对象。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

