记录一个自己搞了4个小时的问题,原因是API函数没有仔细研读。
在飞行漫游的场景中,我使用到了viewer.clock控制飞行起始和飞行结束,同时注册了飞行的时钟函数和飞行截止事件。碰到的问题是飞行终止事件都调用了,在该事件中移除了飞行时钟刷新事件和飞行终止事件,但是飞行的时钟刷新onTick事件回调函数始终在打印日志,
自己也调用addEventListener 和removeEventListener这两个函数,期望达到事件添加和移除的目的。打印的日志很明显告知,移除并未成功;
尝试 博客 https://blog.csdn.net/chenguizhenaza/article/details/108381509中介绍的方法,并未成功;
记录下最后成功的方法:
看看addEventListener文档,您会发现两种不同的方法来撤消添加事件监听器:一种是调用匹配的removeEventListener,另一种是保存从addEventListener
返回值并稍后调用它。
以下是一些显示两种方式的代码。使用对您的代码更有意义的选项,但不要同时使用它们。(不要同时使用它们,很重要)
// 第一种办法
function onTickCallback(clock) {
// ... do stuff with every tick ...
}
viewer.clock.onTick.addEventListener(onTickCallback);
function unsubscribeOption1() {
// 一个选择是调用移除 removeEventListener.
// 在这个例子中,你不需要保存addEventListenerde 返回值 ("var unsubscribeTicks" )
// 但是你需要回调函数onTickCallback的引用,作为参数传递给r;emoveEventListener
viewer.clock.onTick.removeEventListener(onTickCallback);
}
// 第二种办法
function onTickCallback(clock) {
// ... do stuff with every tick ...
}
var unsubscribeTicks = viewer.clock.onTick.addEventListener(onTickCallback);
function unsubscribeOption2() {
// 在这个选择中,你需要保存addEventListener的返回值
// 返回值是一个移除的回调函数,它可以清除onTickCallback事件
unsubscribeTicks();
}
// 我踩的坑在于把两种方式混用:
function onTickCallback(clock) {
// ... do stuff with every tick ...
}
var unsubscribeTicks = viewer.clock.onTick.addEventListener(onTickCallback);
function unsubscribeOptionMy() {
viewer.clock.onTick.removeEventListener(unsubscribeTicks);
}
这里截取api函数截图说明: