首先理解下dojo.declare
Dojo类的定义方式如:dojo.declare("myclass",null,{});理解该类的定义请先理解基于原型的继承方式。
dojo.declare提供了另外两个函数:preamble和postScript。其中,preamble在
constructor之前执行,而postScript在constructor 之后执行。
preamble主要用于处理超类的参数。postScript主要用于触发部件的创建过程。
重点来了,理解dijit._Widget、dijit._Templated
_Widget:
preamble:它为在constructor接收到参数之前处理参数提供了机会。意思就是正常情况下传入constructor中的参数都会传入preamble中。而且,无论preamble返回什么,其返回的结果都会传递给constructor。
constructor:
postMixInProperties:这个方法会在dojo处理继承关系并向子类中混入所有基类属性时被调用。即,当这个方法执行时,子类已经可以访问所有继承的属性,并在部件出现在屏幕上之前操作这些属性。你可以来修改或派生模板标记中的占位符($(property))的恰当位置
buildRendering:它用来将内部的_Widget.domNode属性设置为一个实际的DOM节点,以便部件真正成为页面的一部分。(postMixInProperties才是修改部件模板的恰当位置)。
在它执行完后,部件本身会立即被添加到dojo的部件管理对象,从而保证部件能在明确调用
destroyRecursive来\页面卸载时被适当销毁。
postCreate: 它在部件已经创建完成并且出现在页面上时执行。通过postMixInProperties执行哪些影响部件样式或在屏幕上位置的操作时务必多加小心,因为这些操作是在部件可见之前发生的。但是postCreate中执行类似的操作有时又会导致页面短暂地‘闪烁’,因为这个方法操作时已经可见的部件。如果一个部件中包含子部件,那么在这个方法中访问子部件也不安全。要想安全地访问子部件,应该使用另外一个生命周期方法startup。如果要安全地访问非子部件,那么必须等到页面加载之后使用dojo.addOnLoad
startup: 它在当前部件及所有子部件都创建完成后被自动调用。因此,该方法是子部件可以安全地引用其他子部件的可靠位置。(在postCreate中尝试引用子部件会导致不一致的行为,且查找原因和解决问题也很困难)。对于通过编程方式的部件,并且该部件包含其他关系的子部件,需要在所有子部件都创建完毕后手动调用startup. 这个方法是在部件创建期间用于加入自定义行为的最后一个可以重写的方法。
顺序:preamble->constructor->postMixInProperties-->buildRendering>postCreate->startup