明天就要上班了,今天来个猛的!

放到项目目录下面了,然后也按照test1.js里面的用法用了,但是不行。
我是在现在的项目的主场景里加了一个button,然后重命名为_button,然后在uikiller.bindComponent(this);的后面加了一句cc.log(this._button.name);运行就报错TypeError: this._button is undefined
我是在firefox浏览器里运行的
而且我打开你的项目,运行场景test1是可以的,不知道问题出在哪里了

知道怎么回事了,因为我的脚本是新建的一个跟canvas同级的节点,而_button是挂在Canvas下面的,所以找不到,感觉这个应该改进成跟节点级别无关或者至少在文档里加以说明,不然真的是莫名其妙。

还提个意见,默认绑定事件的名称为什么要跟节点的名称不一样呢,这样很让人疑惑,我觉得应该就是on加节点名再加事件名,不要搞得那么复杂。

很高兴你能提出你的意见,目前事件函数的名命规则是,前缀 + 中缀 + 后缀组成,具体公式如下

“_on” + 节点名(去下划线,且首字母大写) + 事件名

例如一个节点名为_button的触摸结束事件,事件函数名为:

_onButtonTouchEnd

这样设计事件函数名遵循了下面2点:

  1. 驼峰名命:这是javascript目前最为流行的代码规范
  2. 私有函数:采用‘‘_’’开始的变量或函数定义为私有,是cocos-js、creator都使用这种习惯,其它javascript库大我也使用这种习惯。当对象的方法被外部调用时,容易识别出那些函数可以被调用,那些不能被调用,自己在编写模块代码时,也能方便看到那些是类的私有函数。

早在cocos-js的时代,UILoader的前缀是可以自定义的,比如可以定义捕获编辑器中以"m_"为前缀的节点,使用"on"做事件前缀。

sz.uiloader.widgetFromJsonFile(this, uiFile, {eventPrefix: ‘on’, memberPrefix: ‘m_’});

后来在移值Creator时结合之前的项目经验和使用场景,这些功能用的很少,而且选项多了使用难度会更大。为了降低代码的复杂度和上手难度,就将这部分功能给去掉了。

uikiller.bindComponent的第二个参数是预留的一个options的对象,将来要做扩展也是有机会的。

上面的解释能否解答你的疑惑,欢迎继续交流。

节点名(去下划线,且首字母大写)
这种规范有点复杂,不直观,另外在脚本里的事件方法其实算不上是私有函数也没必要加上下划线。
还有,我发现一个问题,如果某个节点是第二层甚至是第N层的子节点,即使加上_也没法触发触摸事件,而且第N层子节点的命名也容易重复,应该有个机制解决这个问题。

你的这个需求,可以加到经后的版本中

你可以尝试下uikiller中的测试范例,里面test1就有多层子节点的用法。我在项目中也是正常使用的,不论多少层子节点。 如果你在使用上任然有问题,可以发一个demo我给你看看。

你别搞的太复杂了,增加了学习成本,新手连基本的api都用不熟,在这官方的用法套上你包装的这一层,损失了灵活性,又易错

针对具体功能的组件,插件,可以挂在节点上直接用的黑盒子比较容易吸引用户支持

恩,感谢你的建议,初衷就是为了简易性少错误,代码更清晰,随后还要关注灵活性,他们又是一对矛盾的综合体,要做到面面具到还需要,不断的进化。
只需要记住两点就可以了:

  1. 驼峰名命
  1. 私有成员前面加“_”

我发现新手主要出错在节点的事件注册太罗嗦,事件回调函数this容易出错,这两点uikiller都解决了,上层代码基本上看不到这些api的影子,也就减少了低级错误的机率。