Events do not fire for an OpenLayers Map object in a Vue serverless web application(在Vue无服务器Web应用程序中不会为OpenLayers地图对象触发事件)
本文介绍了在Vue无服务器Web应用程序中不会为OpenLayers地图对象触发事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个Vue无服务器Web应用程序,它有一个OpenLayers地图,它在mounted
中初始化,并由ImageWMS
层填充,ImageWMS
层由函数更新。我在每个更新参数操作之后调用this.map.renderSync()
,然后在所有层的呈现完成时尝试执行另一个函数(如rendercomplete
事件描述的那样加载和呈现所有层)。令我惊讶的是,当贴图最初在mounted
中呈现时,this.map.on("rendercomplete",this.myFunction())
只会触发一次。我遗漏了什么?如果且仅当我更新所有层的参数后,所有层都已加载并渲染,我如何才能执行this.myFunction()
?
async mounted() {
this.map = new Map({
target: this.$refs['map'],
layers: [
this.osm,
this.fwhotspots,
this.surface25,
this.surface10
],
view: new View({
center: fromLonLat([-97, 43]),
zoom: 4
})
});
this.map.on("rendercomplete", this.flagCallback());
},
methods: {
setTimeSurface10: function () {
if (this.currentTimeSurface10 === null) {
this.currentTimeSurface10 = this.startTimeSurface10;
} else if (this.currentTimeSurface10 >= this.endTimeSurface10) {
this.currentTimeSurface10 = this.startTimeSurface10;
} else {
this.currentTimeSurface10 = new Date(
this.currentTimeSurface10.setMinutes(this.currentTimeSurface10.getMinutes() + 60)
);
}
this.surface10.getSource().updateParams({ TIME: this.currentTimeSurface10.toISOString().split(".")[0] + "Z" });
},
flagCallback: function () {
console.log("RenderComplete Callback");
},
mapToCanvasList: function () {
setTimeout(() => {
this.setTimeSurface10();
this.map.renderSync();
this.myCallback();
console.log("First"); }, 1000);
setTimeout(() => {
this.setTimeSurface10();
this.map.renderSync();
this.myCallback();
console.log("2nd"); }, 2000);
setTimeout(() => {
this.setTimeSurface10();
this.map.renderSync();
this.myCallback();
console.log("3rd"); }, 3000);
setTimeout(() => {
this.gif.on('finished', function(blob) {
window.open(URL.createObjectURL(blob));});
this.gif.render();
}, 4000);
},
myCallback: function () {
console.log("Callback Called");
const mapCanvas = document.createElement('canvas');
const divElement = document.querySelector(".map");
mapCanvas.width = divElement.offsetWidth;//size[0];
mapCanvas.height = divElement.offsetHeight;//size[1];
const mapContext = mapCanvas.getContext('2d');
Array.prototype.forEach.call(
document.querySelectorAll('.ol-layer canvas'),
function (canvas) {
if (canvas.width > 0) {
const opacity = canvas.parentNode.style.opacity;
mapContext.globalAlpha = opacity === '' ? 1 : Number(opacity);
const transform = canvas.style.transform;
const matrix = transform
.match(/^matrix(([^(]*))$/)[1] //eslint-disable-line
.split(',')
.map(Number);
CanvasRenderingContext2D.prototype.setTransform.apply(mapContext,matrix);
mapContext.drawImage(canvas, 0, 0);
}
}
);
this.gif.addFrame(mapCanvas, {copy:true, delay: 200});
console.log("Callback End");
}
推荐答案
this.map.on
有两个参数,事件名称为字符串("rendercomplete"
)和一个回调函数。您的回调函数是this.flagCallback
,没有()
。您可以看到一次控制台日志记录,因为该函数在创建侦听器时调用一次。
这篇关于在Vue无服务器Web应用程序中不会为OpenLayers地图对象触发事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在Vue无服务器Web应用程序中不会为OpenLayers地图对象触发事件
基础教程推荐
猜你喜欢
- 在for循环中使用setTimeout 2022-01-01
- 动态更新多个选择框 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06