creator 文档上的自定义事件同一级别的节点收不到! 只向父节点 冒泡!!不知道为毛这么设计!!! 我父节点想向子节点 发事件不是无解了!! 文档上也没说名用原生的 cc.eventManage.dispatchCustomEvent 可以向全节点发送消息没有限制!!
文档希望在完善一些! 用过cocos2dx的有经验可以找出解决问题方法! 没用过的第一次用就creator的直接GG了
这是历史原因,当年做 0.5 版本时一切向 W3C 标准看齐,所以我也就照着 W3C 实现了这套冒泡机制。但是经过一段时间的消化,这套标准还是很合理的。我倒想知道为什么你觉得同一个级别的节点需要收到事件?
你想要做的是事件广播?广播给所有子节点可是开销很大的。建议你自己在逻辑层实现。
就是因为不想要用户这么用,我们才没写到文档啊。eventManager 之后会干掉的。所以这部分不存在你说的 2dx 经验就能找到解决方法一说。
推荐的做法还是用 Creator 的现在这套事件机制。
父节点向子节点发事件很常见啊,观察者模式!有时候需要通知所有子节点改变同步数据!发事件是为了解耦合,自己逻辑上处理会写很多子节点对象去便利,一旦有一个节点不需要同步删除了方法就会报错!!! 事件是最常见 解耦的方式! 而且不要去限制他!个人觉得,因为对于业务层来说,做引擎的你不清楚他需要解决哪些具体问题,我建议保留这个功能!
如果 没有2dx经验来说可能就不清楚有个 cc.eventManage可以这么用! 想你说的采用节点向上一层节点的方式!!! 如果父对子只能写死逻辑!
开销会很大吧,自定义事件最好自己写个管理单例,否则随意到处光注册不注销,心慌慌
节点删除上面的事件监听也会注销! 请参考addEventListenerWithSceneGraphPriority
我到现在不知道节点destroy后,是否真的删除,里面带的事件和动作还在不在,不在自己的掌控范围内,心慌慌
观察者模式需要父子节点知道彼此。而你说的发事件其实是父子节点互相不知道。确切的说,父节点向未知的子节点发事件,不是一个常见的需求。
你可以子节点自己在父节点上面监听事件,比如
parent.on(‘delete’, this.xxx, this);
这样一样是解耦啊。干嘛一定要用父节点把事件发给子节点啊。你见过哪个观察者模式是发事件的人一个一个去把事件发送给监听的人???
他那个像是广播
教师的电话改了! 是不是所有他的学生的notebook都要update啊!!! 教师发起的修改! 学生监听,教师是父节点学生都是他的子节点!!!
不说了!没啥意义了 我们从cocos2dx 0.99-0.72开始使用从observer到eventManger都是这套架构理论,也许不合理,但是您的看齐标准,上层业务就全部要适应!
您认为策划提的不寻常的需求会少么?
学生有可能还会有其他教师的电话,教师和教师之间可以不认识!!! 总之我发更新事件还需注意每个界面节点之间层级关系这样合理么,这还是简单了,遇到复杂的问题,很可能有未知节点的存在需要您去通知,因为你不是一个人在写代码!其他同学需要得到通知,我只需在我自己的节点要拦截你的事件即可,我为啥还要知道你节点什么关系才能用, 不需要的就不拦截,谁在意你这事件从哪来来的!!! 这才是解耦目的!我根本不需知道你的情况,我只改我需要的就可以了!
我前面说的方案不就能解决你说的这个需求吗?而且更直接。
你混淆了事件派发(职责链模式),和监听器(观察者模式)这两个概念。你这里只是需要监听器而已。根本不用用到事件派发,事件拦截这些机制。所以你也不需要考虑节点之间的层级关系。而你一直要强调教师是父节点,学生是子节点什么的,在我看来这是无关的。
建议你好好理解一下我的回复,不要急着反驳,因为你反驳的论据在我看来都是 Creator 已经支持的。
至于你说以前 cocos2dx 什么的,这个很抱歉,我们不可能兼容那些历史包袱,否则引擎还怎么发展?
算了,我补充下,解释得清楚点,这样其它人也能参考一下:
不需要关注层级关系,因为这里用不到事件派发。Creator 现在的事件机制是去中心化的,任意一个节点,不论是父节点,子节点,还是全局节点,都可以收发事件。
未知节点需要通知的话,说明你搞反了。应该是未知节点负责监听事件,而不是你负责去遍历未知节点。你应该这样写:
// this == 未知节点
// target == 您
// this.onShit = function () { console.log('shitted'); }
// 未知节点负责监听
target.on('shit', this.onShit, this);
// 您只负责触发事件,不管有多少未知节点都能收到
target.emit('shit');
// 结果:
输出 "shitted"
如果您要生搬硬套设计模式!我不是计算机专业的不太懂里面什么玄机!我只需要找到实际解决问题的方法!!!!
用creator是能解决,我那怕要拉一个空节点专门去中转事件,不过您让目前的引擎对用户有个360度的适应转变是个漫长的过程!!!
额!!!我没有说要去遍历节点,算了不在一频道上! 我理解您的意思!
这个“shit” 能不能换个词 容易引起误会! 我们在讨论问题