http://blog.csdn.net/leecho571/article/details/6799059
Ext4改了好多,树控件都改得自己不认识了,切入正题:
在Ext3中只要注册了'click','contextmenu',就会将Node对象传进来,代码示例:
- contextmenu : function(Ext.tree.TreeNode,Ext.EventObject e)
这样到话就可以直接得到node对象,但在Ext4中变化好大了,传进来的没有Node对象,代码示例:
- itemcontextmenu( Ext.view.View this, Ext.data.Model record, HTMLElement item, Number index, Ext.EventObject e)
传进来到参数得不到Node对象就无法操纵树,今天看了源码,看了文档终于研究了好久才得出了一个结论:
其实record里面就包含了Ext3中treeNode到方法,recorrd就是Node对象。区别在于,Ext4中record只是完全跟数据相关,不跟页面展示发生关系,页面展示通过Ext.tree.View实现。
下面所一段Ext.tree.View中的源码:
- setNode: function(node) {
- var me = this;
-
- if (me.node && me.node != node) {
-
- me.mun(me.node, {
- expand: me.onNodeExpand,
- collapse: me.onNodeCollapse,
- append: me.onNodeAppend,
- insert: me.onNodeInsert,
- remove: me.onNodeRemove,
- sort: me.onNodeSort,
- scope: me
- });
- me.node = null;
- }
-
- if (node) {
- <span style="color:#FF0000;">Ext.data.NodeInterface.decorate(node);</span>
- me.removeAll();
- if (me.rootVisible) {
- me.add(node);
- }
- me.mon(node, {
- expand: me.onNodeExpand,
- collapse: me.onNodeCollapse,
- append: me.onNodeAppend,
- insert: me.onNodeInsert,
- remove: me.onNodeRemove,
- sort: me.onNodeSort,
- scope: me
- });
- me.node = node;
- if (node.isExpanded() && node.isLoaded()) {
- me.onNodeExpand(node, node.childNodes, true);
- }
- }
- },
标红到为关键代码,Ext.tree.View获得Ext.data.Model对象之后,将Ext.data.NodeInterface中Node相关的属性复制到Ext.data.Model中,看decorate的实现:
- decorate: function(record) {
- if (!record.isNode) {
-
-
- var mgr = Ext.ModelManager,
- modelName = record.modelName,
- modelClass = mgr.getModel(modelName),
- idName = modelClass.prototype.idProperty,
- instances = Ext.Array.filter(mgr.all.getArray(), function(item) {
- return item.modelName == modelName;
- }),
- iln = instances.length,
- newFields = [],
- i, instance, jln, j, newField;
-
-
- modelClass.override(this.getPrototypeBody());
- newFields = this.applyFields(modelClass, [
- {name: idName, type: 'string', defaultValue: null},
- {name: 'parentId', type: 'string', defaultValue: null},
- {name: 'index', type: 'int', defaultValue: null},
- {name: 'depth', type: 'int', defaultValue: 0},
- {name: 'expanded', type: 'bool', defaultValue: false, persist: false},
- {name: 'checked', type: 'auto', defaultValue: null},
- {name: 'leaf', type: 'bool', defaultValue: false, persist: false},
- {name: 'cls', type: 'string', defaultValue: null, persist: false},
- {name: 'iconCls', type: 'string', defaultValue: null, persist: false},
- {name: 'root', type: 'boolean', defaultValue: false, persist: false},
- {name: 'isLast', type: 'boolean', defaultValue: false, persist: false},
- {name: 'isFirst', type: 'boolean', defaultValue: false, persist: false},
- {name: 'allowDrop', type: 'boolean', defaultValue: true, persist: false},
- {name: 'allowDrag', type: 'boolean', defaultValue: true, persist: false},
- {name: 'loaded', type: 'boolean', defaultValue: false, persist: false},
- {name: 'loading', type: 'boolean', defaultValue: false, persist: false},
- {name: 'href', type: 'string', defaultValue: null, persist: false},
- {name: 'hrefTarget',type: 'string', defaultValue: null, persist: false},
- {name: 'qtip', type: 'string', defaultValue: null, persist: false},
- {name: 'qtitle', type: 'string', defaultValue: null, persist: false}
- ]);
-
- jln = newFields.length;
-
- for (i = 0; i < iln; i++) {
- instance = instances[i];
- for (j = 0; j < jln; j++) {
- newField = newFields[j];
- if (instance.get(newField.name) === undefined) {
- instance.data[newField.name] = newField.defaultValue;
- }
- }
- }
- }
-
- Ext.applyIf(record, {
- firstChild: null,
- lastChild: null,
- parentNode: null,
- previousSibling: null,
- nextSibling: null,
- childNodes: []
- });
-
- record.commit(true);
-
- record.enableBubble([
-
- "append",
-
-
- "remove",
-
-
- "move",
-
-
- "insert",
-
-
- "beforeappend",
-
-
- "beforeremove",
-
-
- "beforemove",
-
-
- "beforeinsert",
-
-
- "expand",
-
-
- "collapse",
-
-
- "beforeexpand",
-
-
- "beforecollapse",
-
-
- "sort"
- ]);
-
- return record;
- },
-
在decorate方法中复制了一系列树节点到相关属性和事件到Ext.data.Model中,并重写了getPrototypeBody方法
在getPrototypeBody方法中,将树节点到操作复制到了Ext.data.Model中,比如:insertChild,remove,eachChild等方法,具体可以去查Ext.data.NodeInterface的文档!!