怎样监听ui节点的销毁事件

比如cc.Label我想在他销毁时获得通知,做标记,这样可以自动取消对他操作的回调函数的调用。

http://www.cocos.com/docs/creator/scripting/life-cycle-callbacks.html

这个文档我当然有看。但是这个是说脚本组件或者是节点销毁的时候可以在onDestroy里处理,我问的是cc.Label销毁的时候我怎么能知道,我想在cc.Label身上装回调函数,怎么搞?

label.onDestroy = function(){}; 这样吧?

Label 一般不会单独销毁,所以你在节点上监听自定义组件的 onDestroy 能达到一样的效果。

这会导致 label 自身无法正常销毁

哦,我还以为它自身只在destroy里处理,翻看了一下CCComponent.js文件里的onDestroy好像并没有实现什么的,可能没看懂吧,但如果说监听了,要怎么做,好像并没看到有那种事件

这里还有一个疑问,如果是继承Component,onLoad,onEnable,之类的函数都是用户自己实现的吧。但是也不需要写调用父类同样的方法,是因为只要重写了那些方法就能自动调用父类的同名方法吗?还是那些方法父类里并没有实现,只交给用户继承后自己来写。对于Label,这些组件,既然都使用了destroy方法,onDestroy又是用来干嘛

Component 确实没实现那些方法,用户也不需要调用。但问题是 cc.Label 并不是直接继承自 cc.Component,它拥有其它父类,其它父类实现了 onDestroy。onDestroy 用于触发终止渲染的操作。

1赞

我想写一个bind函数,绑定一个回调cb到某个组件上,当组件在的时候调用正常,组件销毁了调用没有任何动作。
function bind(cb, component) {
return function() {
if (cc.isValid(component))
cb.apply(component, arguments);
};
}
我这样实现的,以后就用这个bind的返回值了(作为回调函数),这样在调用处就不用判断直接调用好了,而在cb里可以放心的使用component,不用担心已经析构了。

这样没什么问题吧,这次是换了个思路,没有再监听label的析构事件了,而是适当时候判断label是否已被销毁。

这样是可以的,灵活使用 javascript。
不过为了节省 javascript 堆内存,可以改成

function bind(cb, component) {
  return function() {
    if (cc.isValid(component))
      cb.apply(component, arguments);
    else
      cb = component = null;
  };
}

另外,我还是建议使用 onDestroy 来处理你需要的析构逻辑。你可以增加一个类似 LabelHandler 的组件,由这个组件作为 label 的 facade,并且在销毁时触发其它组件逻辑。

其实我也想到自己写法的缺点,就是component会长时间被引用而没有可能做gc,只是一时不知道怎么处理,原来很简单嘛,赋空就好了,学习了。只不过这样还是要在回调后才有可能赋空释放内存,可能label之前已经析构了,也就是释放不及时。你说建议用onDestroy是不是想更及时的释放内存?

是的11111111111111

function bind(cb, component) {

component.on('destroy', function() {
	cb = component = undefined;
}

return function() {
    if (cb && component)
        cb.apply(component, arguments);
};

}

其中的component.on(‘destroy’, function() {…}) 有这种事件接口吗?

目前没有111111111

好吧,那我还是保守治疗,不在destroy的第一时间而是回调的时候赋空好了。

this.node.on(‘active-in-hierarchy-changed’,function(node){
if(!node.active){
//todo
}
});

如果你在场景中没有多次激活这个节点的操作,可以监听激活状态来处理。

2赞