Cocos Creator 3.6.3 社区版公测

我写了如下代码测试

class Test {
    test(): void {
        console.log("it is a test");
    }
}

let t1 = new Test;
let t2 = new Test;

if (t1.test === t2.test) {
    console.log("the same function");
}
else {
    console.log("different");
}

判断结果是相等。那引擎如果这样存储 callback 的话,就会出问题了。

吃瓜群众问下为啥不使用索引的方式,给绑定的回调方法,返回一个独一无二的INDEX。
取消的时候,提供这个INDEX即可。
例如,我的代码片段:
/**
*
* @param {string} type
* @param {function} func
* @param {Context} [context=null]
* @return {number}
*/
InteractiveSpriteProto.bindEvent = function (type, func, context) {
var _self = this;
var callbacks = _self._events[type];
if (callbacks == null) {
callbacks = _self._events[type] = {};
}
callbacks[_self._eventIndex++] = {func: func, context: context};

    return _self._eventIndex;

};

一个复杂点的界面10个绑定
那得写10个成员来记录返回的index

没遇到过这样的问题,一个界面,同一个对象上同一个事件有多个个同样的侦听。
如果是一个类的多个实例,类的内部自己处理了,也不会手动有十个需要自己解除。
如果要删除同类型的 在解绑事件时,不提供eventId即可
例如:
InteractiveSpriteProto.unbindEvent=function(type,eventId){

}

返回 index 是可以解决唯一性问题,实现可能还更简洁。主要在于使用者需要保存这个 index,比较不方便。这种没有对错,也没法满足所有的需求。还有一个就是参考了 web 标准的接口。

target 是可选参数,off 需要具备在没有 target 的情况下识别不同 callback 的能力。如果依靠 target 的话就会出现 on 不同的事件就要传入不同 target 的情况,这对一些匿名函数、全局函数就不太友好了。既然要求通过 callback 来识别,那么就应该保持行为一致性了。否则当传了 target 就 off 这个 target 的全部 callback(此时无视传入的 callback),不传 target 就 off callback,就太坑了。
因此,我们单独提供了一个 targetOff,用来避免这种歧义。有根据 target 的需求就调用 targetOff 就好了。

1赞

好的,感谢解惑

这个报错没事,这是因为把这个注释或删掉了,实际啥也不影响

spine和SkeletalAnimation的接口能不能设计的更好用一点

用了cocos4年,我第一次见到不会用节点事件的,你说的不在少数我只觉得除了新手外,可能你的确是那个少数,至少我呆过的三四家公司,共事过的几十个开发,都没有遇到无法正确理解节点事件的

那我没法了。我确实以为是off的回调函数,我从来也没去认真看过每个api文档,
其实这个也挺好理解的,我上面也举过例子了,比如我前面肯定是看过on的api每个参数,知道了callback的含义,然后我现在去翻cocos文档看到有个用法是off注销事件,接着我也看到有个参数是callback,此时,我相信大部分人都不会再看去这个off的callback参数到底是什么的callback,所以我用了几年也无法知道这个callback还能跟on的callback相关联而起名的,
举个例子,room.destroy(callback:func),我相信有点经验的老司机都不会去翻看api文档来确定这个callback到底是房间的销毁回调呢还是其他回调呢?这样推理过来的话,很容易理解我的糊涂了。
也可能是我并非真的前端,半桶水罢了,我是没曾想还能这么起名的。。。以后还是多看api文档,单看指南手册还不行,得逐个api去看,那确实真的挺麻烦的,其实可以做个统计这样就能确定是否有其他人跟我有一样的困惑,当然不排除我是个例。如果能不看参数介绍就能从参数的名称知了函数的用法应该是最稳妥的。当然万事难求全。
我是有个习惯,如果参数名我看不懂我才会去看参数的具体介绍,像这样callback的参数名,应该业内大部分人都知道是什么意思,所以我就草率了

还有你没统计过,所以在你身边人即使遇到过也不一定会告诉你哦。。。(本言论不违反社区规定,被恶意屏蔽,管理请查清楚)

纠结这些,还不如把bug修改完,不比啥都强么

你的帖子已经被社区标记并被临时隐藏。

这次我赞同你的,我一直觉得引擎组很忙,居然在这个问题上可以跟进这么久,真的,我到现在都没遇到过这个写错的,on/off机制,我就没有看到有其它设计的

2赞

用handle或者eventCallback都行,确实从callback字面上会有点歧义。不过这么多年从来没有遇到过身边有人这个会用错,倒是遇到过对Function的bind不熟悉的,在callback上bind(this)导致off的时候和on不是同一个callback无法off调的人,但是这个只是对语言不熟悉导致的。命名上可以说是有问题,不过其实是个很小的问题,真要遇到一些奇怪的问题排查的时候看一下引擎源码就行(开源的优势)

虽然明白楼主的意思,但是我觉得楼主才是极个别的少数…
另外改成listener确实更直观些~

我这边出现这个报错的时候会导致键盘消息发送不出来,我猜可能是打断了某些流程
我直接document.getElementById(‘GameCanvas’).addEventListener(‘keyup’, ()=>{});都拿不到键盘消息

确实离谱,这个问题可以扯这么久。

你的意思是你比官方更加聪明?..我曾经跟众多phper争辩也争辩不过,具体原因我想大家都明白,我不是嘲讽各位,是真的段位不同,不必用过于肤浅的认知来看待我和官方讨论这个问题的必要性,而且,都说是论坛,我发现很多国人喜欢嘲讽人家是否有发言权,大哥,能拜托你看下这是什么地方不。。。这是论坛,既然官方愿意回复我,我觉得讨论一下没什么可谴责的吧?我实在是想不出你们到底是不是嫉妒我被官方认真对待?。。。那我只能说抱歉,你们的问题没能引起他们的注意,我也是初来乍到,不了解cocos,给大伙丢脸了。在这里给大伙诚恳的道歉,我想我不应该占用官方解决你们问题的时间,还请官方快去解决你们的问题。我无意引起口水战,但是我一直都是在跟官方讨论,然后就发现有人将枪口瞄准我,谁是受害者,我想一清二楚,不是我过于敏感,也许更多的是你们喜欢秀自己多聪明?或者秀自己观点:认为官方不应该在我的问题上面浪费时间?具体缘由确实值得深究和后人警醒。确实网络看不见摸不着放大了人性的弱点,可以肆无忌惮口伐笔诛,至于机关枪后面是“陋室”还是“沃土”那就参差不齐因人而异了,这段文字不仅是回复你,更多的是回复上面的那几位