CocosCreator编码贴士:活用_isOnLoadCalled属性延迟代码执行时机

我这个人有一个习惯,喜欢写getter/setter,这样的好处是在设置了某属性值时会自动更新UI,省了不少事,但是在cocosCreator里面更新UI的操作必须在onLoad事件触发之后,如果不遵循这个原则,那么你访问的节点很有可能是空。
例子代码:

cc.Class({
    extends: cc.Component,

    properties: {
        background: cc.Sprite,
        bgImg: {
            get () {
                return this._bgImg;
            },
            set (value) {
                if(this._bgImg!= value)
                {
                    this._bgImg= value;
                    this.updateView();
                }
            },
            visible: false
        },

    },

    updateView(){
        this.background.spriteFrame = this._bgImg;
    },

});

每当我设置了上述代码中的bgImg = xxx时都会导致updateView方法被调用来更新UI,即改变this.background的纹理。但是有时候在updateView方法被调用时我的onLoad方法还未被执行,这时候this.background就是underfined,这样的话就会导致报错。
好在cc.Component类里面提供了一个私有属性叫做_isOnLoadCalled,下面是官方API文档对其的解释:

_isOnLoadCalled Number 返回一个值用来判断 onLoad 是否被调用过,不等于 0 时调用过,等于 0 时未调用。
那么,借助该属性,我们可以把代码改为

cc.Class({
    extends: cc.Component,

    properties: {
        background: cc.Sprite,
        bgImg: {
            get () {
                return this._bgImg;
            },
            set (value) {
                if(this._bgImg!= value)
                {
                    this._bgImg= value;
                    if(this._isOnLoadCalled)//对onLoad是否已被调用的把关
                    {
                        this.updateView();
                    }
                }
            },
            visible: false
        },

    },

    //因为bgImg的setter中可能没能执行updateView,因此在onLoad中需要执行该方法,哪怕updateView被执行了两遍也没关系
    onLoad(){
        this.updateView();
    }

    updateView(){
        this.background.spriteFrame = this._bgImg;
    },

});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,556评论 1 11
  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 800评论 0 3
  • 还记得去年夏天来巡视过校园的老朋友喵大王汤圆吗? 点击查看️️️ 在大学等你 | 没有你的校园,有点寂寞·····...
    苏农不吃冰阅读 271评论 0 0
  • 小航: 你好,你好,你好。 见字如面。 如果没有机会或者时间说,那就让文字来架起一座桥梁吧。总有一天你会体会到,写...
    沧海之心阅读 372评论 1 3
  • 以空杯心态练旗袍秀,身体状态呈现的僵硬、动作不协调、表情不自然非常明显,但体验过程中我是快乐的,用:心去...
    心灵的笑声阅读 323评论 2 4