ext2의tree id는 유일한 해결 방법이 아니다

3349 단어 UIext
현황: 하나의tree, 두 그룹은tree의 노드가 데이터의 두 테이블에서 꺼내기 때문에 id가 중복될 수 있지만 ext의tree 역시 ID를 통해 구분되어 초점이 정확하게 포지셔닝되지 않습니다.
해결 방법:
1단계:treeloader 클래스의createNode 다시 쓰기 방법

createNode : function(attr){
        if(this.baseAttrs){
            Ext.applyIf(attr, this.baseAttrs);
        }
        if(this.applyLoader !== false){
            attr.loader = this;
        }
		attr.text = attr.dirname;
		attr.id = attr.dirid;
		attr.treeid = attr.type+attr.dirid;// 
        if(typeof attr.uiProvider == 'string'){
           attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);
        }
        return(attr.leaf ?
            new Ext.tree.TreeNode(attr) :
            new Ext.tree.AsyncTreeNode(attr));
    }


2단계: Ext.tree를 다시 작성합니다.TreePanel 클래스의 registerNode 방법, tree 등록 treeid를 실제 ID로 기록합니다.

Ext.override(Ext.tree.TreePanel,{
	getNodeByTreeId : function(treeid){
        return this.nodeHash[treeid];
    },
	registerNode : function(node){
        this.nodeHash[node.attributes.treeid] = node;
    },
	unregisterNode : function(node){
        delete this.nodeHash[node.attributes.treeid];
    }

})

3단계: Ext.tree 다시 쓰기.TreeNode 클래스의 ensureVisible 방법으로 getNodeByTreeId를 treeid로 호출합니다.

Ext.override(Ext.tree.TreeNode,{
	ensureVisible : function(callback){
        var tree = this.getOwnerTree();
        tree.expandPath(this.parentNode.getPath(), false, function(){
            var node = tree.getNodeByTreeId(this.attributes.treeid);  // Somehow if we don't do this, we lose changes that happened to node in the meantime
            tree.getTreeEl().scrollChildIntoView(node.ui.anchor);
            Ext.callback(callback);
        }.createDelegate(this));
    }
})

4단계: Ext.tree 다시 쓰기.TreeEventModel 클래스 getNode 메서드, getNodeByTreeId 메서드 조정
Ext.override(Ext.tree.TreeEventModel,{
	getNode : function(e){
        var t;
        if(t = e.getTarget('.x-tree-node-el', 10)){
            var id = Ext.fly(t, '_treeEvents').getAttributeNS('ext', 'tree-node-id');
            if(id){
                return this.tree.getNodeByTreeId(id);
            }
        }
        return null;
    }
})

다섯 번째 단계: Ext.tree를 다시 씁니다.TreeNodeUI 클래스, 저는 상속, renderElements 덮어쓰기 방법을 사용합니다. 주로 이 문장입니다.
6단계: 이 트리가 드래그를 지원한다면 Ext.tree를 다시 써야 합니다.Tree DropZone의 onNode Over.
덧붙이다

onNodeOver : function(n, dd, e, data){
		if(n.node == undefined){
			return;
		}

*****
}

7단계: 새 노드를 만들 때 아래 (treeid)

var attr = {
					text: ' ',
					type: node.attributes.type,
					treeid: Ext.id(null, node.attributes.type),
					uiProvider: BufTreeSpecUI
				}
var n = new Ext.tree.TreeNode(attr);


이때, 업무에서 인용한 것은 여전히 node이다.id 속성

좋은 웹페이지 즐겨찾기