dijit控件生命周期分析

    所有的基于dijit的widget共同父类为dijit._Widget,由于javascript先解析父类在解析继承的子类javascript继承机制,dojo机制下的所有widget会按照以下顺序完成自身js对象生成以及dom对象的渲染。
1) postscript                      
2) create
3) postMixInProperties
4) buildRendering
5) postCreate
6) startup
在解析widget时,dojo会生成一个新建一个widgetset对象dojo.registry用来管理widget,dojo.registry中的属性_hash用来保存widget,如果widget有id这个属性可以通过dojo.registry.add(widget)方法将widget放到_hash中,如果没有id或者id重复,这也是id在html中必须设置的原因。接下来我们就可以使用dijit.byId(也就是dojo.registry.byId)获取widget的js对象。
这个地方的代码为。
// dijit.WidgetSet包含所有拥有唯一id的widget对象
dojo.declare("dijit.WidgetSet", null, {
    //构造器,初始化this._hash
	constructor: function(){
		// summary:
		//	A set of widgets indexed by id
		this._hash={};
	},

	//注册,id冲突会失败
	add: function(/*Widget*/ widget){
		if(this._hash[widget.id]){
			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
		}
		this._hash[widget.id]=widget;
	},
	
	//根据id移除
	remove: function(/*String*/ id){
		delete this._hash[id];
	},

    //通过这个可以遍历现有的widget
	forEach: function(/*Function*/ func){
		for(var id in this._hash){
			func(this._hash[id]);
		}
	},
     
    //通过此方法可以查询到满足条件的widget集合
	filter: function(/*Function*/ filter){
		var res = new dijit.WidgetSet();
		this.forEach(function(widget){
			if(filter(widget)){ res.add(widget); }
		});
		return res;		// dijit.WidgetSet
	},
     
     //根据id获取widget对象
	byId: function(/*String*/ id){
		return this._hash[id];
	},
     
    //可以获取同一类型的widget
	byClass: function(/*String*/ cls){
		return this.filter(function(widget){ return widget.declaredClass==cls; });	// dijit.WidgetSet
	}
	});

dijit.registry = new dijit.WidgetSet();     //dijit.registry用来管理widget对象

你可能感兴趣的:(JavaScript,html,dojo)