若一个组件中包含一个子组件(以has-a的形式存在而不是以Child的形式存在),不要将子组件作为参数传给父组件的构造函数,父组件构造函数运行this.component = component时不知道为什么会调用子组件的构造函数创建一个新的子组件,而不是使用以参数形式传进来的子组件(也可能是我的构造函数代码写错了?毕竟以前没有接触过TypeScript,确实是找不到原因)。这样做的直接影响就是如果子组件含有动画,调用自己创建的子组件的play()函数会失效。
后来发现我错在哪里了,TypeScript的构造函数好像会直接对所有类中的对象进行默认初始化new一个对象?不是很确定,后来把子组件的初始化交由父组件的构造函数自行实现,又发现初始化失败了,调用Chara.player的时候又报给我player未定义
可以看出来,Player的构造函数在Chara的构造函数中被调用了,但是还是没有传给Chara.player作为对象,那这个被创建出来的子组件对象到底跑哪里去了。。
测试了一下,发现并不是父组件的构造函数调用的,而是这个修改皮肤名字的语句调用了子组件的构造函数,而整个ui的显示都由eui这里自动创建的子组件进行着,也就是说如果拿不到eui自己创建的子组件就根本没办法调用子组件动画的play()方法,然而根本拿不到这里的对象啊,那要怎么对子组件进行操作呢?
后来只好在父组件里设一个静态对象,子组件构造函数被调用时给父组件设值后父组件再传回给自己的对象里
测试
Player对象终于不是空的了
调用了一下play()函数,好家伙还是没有用。
再琢磨琢磨,最后发现在Main函数中
这里的LoadResource函数加载静态资源时会调用所有在default.res.json中含有的组件的无参构造函数来注册这个组件。也就是说egret的component在***初始化资源*和父组件设值skinName时都会执行一次无参构造函数,构造出不同的组件来。
但显然我们需要的对象并不是初始化资源时创建的对象,因为这时候Main的主屏幕都还没有建立,这时创建的对象我也不知道是用来干嘛的了。。。
在构造函数中添加this.run.play()后发现起作用的对象就是父组件设值skinName时自动创建的这个对象
最后又发现一个很操蛋的事情
这里是Player(子组件)的无参构造函数,如果加入最后一行的Chara.ins = this;后,前面的this.run.play()就不生效。如果不加的话就可以生效,这又给我整蒙了
然后又发现不是这里的问题,而是
在Chara的构造函数中直接把对象设为Chara.ins,这里导致了动画失效
最后把这个逻辑放出来
整个逻辑竟然成功了,动画也显示了出来。。。
现在脑子跟浆糊一样蒙。
是不是哪里出现了逻辑错误导致最后调整了这么久??求大神指点