-
Creator 版本:Cocos Creator v2.3.1
-
目标平台: 开发中,chrome浏览器
-
重现方式:例如A-B-C 再从C返回B 又需要B再去C C场景第二次进入 this.node 选取就没了
-
首个报错:有三个场景 比如 A是登录 B是大厅 C是游戏
从A-B-C 玩游戏没问题 游戏结束后从 C返回B大厅 B大厅也没问题
但是再次从 B大厅返回C游戏的时候 就会报错
Uncaught TypeError:Cannot read property ‘getChildByName’ of null
我试着在控制台打印过 第二次 this.node 返回的就是null了
/
只有C场景 有使用到 socket.io 从C游戏返回大厅的时候 我有使用
socket.disconnect();
socket.close();
断开 进来再次连接
socket.connect();
/
有大佬说是监听的问题,但是我这个场景 除了 socket.io 是没有的
这个报错的地方语句 都是在事件内,比如哪个用户进房间了就
this.node.getChildByName(‘user-1’).active = true;
大都是这些 控制 显示或不显示的
肯定是监听事件没移除,切换场景后,又收到消息了,但是旧的节点已经不存在了
那我具体应该怎么做呢
是关闭场景 要跳出的时候 把
properties: {}
这个内的节点全销毁吗
你项目里注册消息事件用的是自己的方法还是系统的?
如果是自己的,在写个移除事件的方法,然后在onDestroy里移除就行了。
如果是系统的,系统会在节点销毁后自动移除。而你切换场景的时候,节点已经移除了,除非你用的是常驻节点。
没用常驻节点
大概代码如下
var global = require(‘global’);
if (window.io == null) {
window.io = require(“socket.io”);
}
var socket = window.io(‘http://127.0.0.1:2022’);
onLoad() {
socket.connect(); 连接
socket.emit(‘join’, {}); 加入房间
socket.on(‘join ok’, function (data) {}); 加入消息
}
function() {
下面函数都是 收到消息后执行对场景的变化
}
if (cc.isValid(this.node)) {
// balabala
}
这个貌似 不是我想要的效果 还是我放的位置不对
其实我想要 不管进来几次 这个 场景都应该是初始一样的才对
感谢大佬 我 是这么做
socket.on(‘join ok’, function (data) {
if (!cc.isValid(this.node)) {
return
}
// balabala
});
把每一个socket.on接收 都套进了这个
这个方法虽然可以达到不报错的效果,但是这个消息还是会进来,真正的解决方法应该是把事件注销