YUI Tree入门(二)各类Node详细分析
之前简单介绍过TreeView的使用,现在来仔细分析一下YUI TreeView的结构,Tree相关的类如下:
我们分成3部分看,第一部分是前面几个以Node结尾的类,这些类代表是树上的节点,其中最顶层的是Node,这个类是其他几种Node的父类。Node中有节点所具有的所有属性和方法,比如children,parent,depth,expand(),collapse()等等。
第二部分是TreeView这个类,这个类就像是一棵树的骨架,他有根有树干有树枝,可以把上面介绍的Node节点挂在Treeview上,Treeview会统一管理记录这些节点。通过TreeView你可以很方便的定位到一个或一些节点,比如 getNodeByElement(),getNodeByIndex,
getNodeByProperty(),getNodesByProperty()。通过TreeView可以控制一棵树是展开还是合拢,可以移除一些节点等等。TreeView就是在全局上控制树上的Nodes。
第三部分是最后三个类,这三个类主要是个树增加一些动画的效果。
既然TreeView是整棵树的总枢纽,我们就先从TreeView入手(由于TreeView的 源码太长,我就不直接贴出来,大家可以对照着源码看,碰到比较重要的代码我会把它们贴出来)。
首先是TreeView的构造函数:YAHOO.widget.TreeView ( id ),构造方法只有一个参数,就是HTML中的Div元素的ID,这就像是给树挖个坑中下去,以后树在页面上显示就有地方了。构造方法里面调用了TreeView的Init方法,这个方法我们稍后再说。
TreeView里面有不少属性,不过大多都不用太深究,无非是用来与HTML元素做绑定,记录TreeView的状态等等,这些属性我们只要构建好了树,就由树内部做管理,一般情况下我们都不会使用到。下面挑几个重要的属性做说明:
YAHOO.widget.TreeView.nodeCount,这是一个静态属性,这个属性记录TreeView上面Node的个数,也就是每次生成一个Node到TreeView上,这个属性值就增加1,这个属性有一个作用就是给Node分配一个唯一的标识,每个Node都有一个属性叫做index,这个index就是由这个属性来分配的。由于这个属性值只增不减,所以永远不会出现重复的。
YAHOO.widget.TreeView.trees,这是一个私有属性,它是一个关联数组,用来缓存所有的TreeView实例,每次生成一个TreeView的实例就会往trees里面设置一个key(TreeView的Id)和value(TreeView的实例)。这样方便以后通过Id可以直接取到TreeView的实例。TreeView有一个方法:YAHOO.widget.TreeView.getTree(treeId),看看它的实现:
YAHOO.widget.TreeView.getTree = function(treeId) { var t = YAHOO.widget.TreeView.trees[treeId];//通过trees属性取值 return (t) ? t : null;};generateId: function(el) { var id = el.id; if (!id) { id = "yui-tv-auto-id-" + YAHOO.widget.TreeView.counter; ++YAHOO.widget.TreeView.counter; } return id; },init: function(id) { this.id = id; if ("string" !== typeof id) { this._el = id; this.id = this.generateId(id);//通过YAHOO.widget.TreeView.counter生成 } this.createEvent("animStart", this); this.createEvent("animComplete", this); this.createEvent("collapse", this);this.createEvent("collapseComplete", this); this.createEvent("expand", this); this.createEvent("expandComplete", this);this._nodes = []; // store a global reference YAHOO.widget.TreeView.trees[this.id] = this; // Set up the root node this.root = new YAHOO.widget.RootNode(this); var LW = YAHOO.widget.LogWriter; this.logger = (LW) ? new LW(this.toString()) : YAHOO; this.logger.log("tree init: " + this.id); },draw: function() { var html = this.root.getHtml(); this.getEl().innerHTML = html; this.firstDraw = false; },YAHOO.widget.Node = function(oData, oParent, expanded) { if (oData) { this.init(oData, oParent, expanded); }};……….init: function(oData, oParent, expanded) { this.data = oData; this.children = []; this.index = YAHOO.widget.TreeView.nodeCount; ++YAHOO.widget.TreeView.nodeCount; this.expanded = expanded; this.logger = new YAHOO.widget.LogWriter(this.toString()); this.createEvent("parentChange", this);if (oParent) { oParent.appendChild(this); }},………
YAHOO.widget.RootNode = function(oTree) {this.init(null, null, true);this.tree = oTree;};YAHOO.extend(YAHOO.widget.RootNode, YAHOO.widget.Node, { // overrides YAHOO.widget.Node getNodeHtml: function() { return ""; }, toString: function() { return "RootNode"; }, loadComplete: function() { this.tree.draw(); }, collapse: function() {}, expand: function() {}});YAHOO.widget.HTMLNode = function(oData, oParent, expanded, hasIcon) { if (oData) { this.init(oData, oParent, expanded); this.initContent(oData, hasIcon); }};YAHOO.extend(YAHOO.widget.HTMLNode, YAHOO.widget.Node, {contentStyle: "ygtvhtml",contentElId: null,html: null,