ExtTreeの右クリックメニューの削除と同期データベースのドラッグ&ドロップ


ExtTreeだけでもExtJsを学ぶのは多くの開発者がよく言う言葉ですが、確かにExtの木への支持は非常によく、非常に美しいです.次に、コードを通じて、ExtTreeの各方面に関する私の学習過程の知識を紹介します.
コードは次のとおりです.
 

Ext.onReady(function() {

Ext.BLANK_IMAGE_URL = 'extjs3.1/resources/images/default/s.gif';

var Tree = Ext.tree;




//       Loader

var treeloader = new Tree.TreeLoader( {

dataUrl : "display.action?nodeId='A1'"

});

//                          ,                         



var treepanel = new Tree.TreePanel( {

// renderTo:"tree_div",//    renderTo,     setRootNode()  ,   TreePanel   root  。

el : 'tree_div', //      ,       HTML      DIV  

rootVisible : true, //   false      ,     ,              

border : true, //    

animate : true, //     

autoScroll : true, //     

enableDD : true, //     

containerScroll : true,

// root:rotnode, //    root     ,

//     root,     setRootNode S

loader : treeloader,

useArrows : true,

checkModel : 'cascade', //        

onlyLeafCheckable : false

//          




//     treeloader            ,             

//   :loader: new Tree.TreeLoader({

// dataUrl:'http://localhost:8080/Struts2JsonExtJsTree/menus.action'

// })

//                       loader:new

// Tree.TreeLoader({dataUrl:"menus.action?id='A1'"});

});

//        

var rootnode = new Tree.AsyncTreeNode( { //              ,           

         id : 'workArea',

text : '    ',

draggable : false

//                ,    FALSE          

});

//       ,         tree   

treepanel.setRootNode(rootnode);




//     ,  node   .                         ,                     

// /    ,  node                   'beforeload'       

treepanel.on('beforeload', function(node) {

treepanel.loader.dataUrl = 'display.action?id=' + node.id; //       Loader

});




// Ext Tree demo  ,  movenode : ( Tree tree, Node node, Node oldParent,

// Node newParent, Number index )

//           , Ext.tree.TreePanel    ,      ,      

//       ,      ajax  ,   ,         .(       )

treepanel.on('movenode',function(tree,node,oldParent,newParent,index){

Ext.Ajax.request({

url:'move.action',

params:{

nodeId:node.id,

oldParentId:oldParent.id,

newParentId:newParent.id,

index:index

}

});

});

/*

*   tree                     e e          ,   dropNode,target,point

* 1.dropNode             2.target           

* 3.point       ,   append    ,above     ,below     。

*/

// treepanel.on('nodedrop', function(e) {

// if(e.point=='append'){

// Ext.Ajax.request({

// url:'node.action',

// params:{

// nodeId:e.dropNode.id,

// oldParentId:e.parentNode.id,

// newParentId:e.target.id

// }

// });

// }

// var msg;

// if (e.point == 'append') {

// msg = '  "【' + e.dropNode.text + '】"     "【' + e.target.text

// + '】" !';

// // alert('  "【' + e.dropNode.text + '】"     "【' + e.target.text

// // + '】" !');

// // var resultUrl =

// // "../info/rss.do?method=treeNodeTuoDong&currenRootId="+e.dropNode.id+"&parentRootId="+e.target.id+"&type=append";

// // var resulthtml = XmlHttpHelper.transmit(false, "get", "text",

// // resultUrl, null, null);

// } else if (e.point == 'above') {

// // alert('  "' + e.dropNode.text + '"   "' + e.target.text

// // + '"  !');

// msg = '  "' + e.dropNode.text + '"   "' + e.target.text

// + '"  !';

// // var resultUrl =

// // "../info/rss.do?method=treeNodeTuoDong&currenRootId="+e.dropNode.id+"&parentRootId="+e.target.id+"&type=above";

// // var resulthtml = XmlHttpHelper.transmit(false, "get", "text",

// // resultUrl, null, null);

//

// } else if (e.point == 'below') {

// // alert('  "' + e.dropNode.text + '"   "' + e.target.text

// // + '"  !');

// msg = '  "' + e.dropNode.text + '"   "' + e.target.text

// + '"  !';

// // var resultUrl =

// // "../info/rss.do?method=treeNodeTuoDong&currenRootId="+e.dropNode.id+"&parentRootId="+e.target.id+"&type=below";

// // var resulthtml = XmlHttpHelper.transmit(false, "get", "text",

// // resultUrl, null, null);

// }

//

// // var viewPanel = Ext.getCmp('tree-window-view');

// // //        

// // win.setTitle('    ');

// // win.show();

// // var tmpTpl = new Ext.Template(msg);

// // tmpTpl.overwrite(viewPanel.body);

// Ext.Msg.alert("    ", msg);

//

// });

treepanel.render(); //   tree        

rootnode.expand();//                 ,                ,         




//       

var contextMenu = new Ext.menu.Menu( {

items : [ {

text : '     ',

handler : addHandler

}, {

text : '     ',

handler : addBrotherHandler

}, {

text : '  ',

handler : deleteHandler

}, {

text : '   ',

handler : modifyHandler

}, {

text : '  ',

handler : viewHandler

} ]

});

// var treeSorter = new Ext.tree.TreeSorter(treepanel, {

// folderSort : true, //    

// dir : 'asc' //  ,         ,                 

// });

var treeEditor = new Ext.tree.TreeEditor(treepanel, {//      

allowBlank : false, //       

cancelOnEsc : true,//   ESC       

selectOnFocus : true 

});

//     

var win = new Ext.Window( {

maskDisabled : false,

id : 'tree-window',

modal : true,//        

constrain : true,//      viewport     

closable : true,//         

closeAction : 'hide',

layout : 'fit',

width : 300,

height : 200,

plain : true,

items : [ {

id : 'tree-window-view',

border : false

} ]

});

         

treepanel.on('contextmenu', treeContextHandler);

//    

treepanel.on('beforemovenode', function(tree, node, oldParent,

newParent, index) {

// alert(tree + '-' + node + '-' + oldParent + '-' + newParent + '-'

// + index);

// TODO        

});

//     ,         append   

treepanel.on('nodedragover', function(e) {

var n = e.target;

if (n.leaf) {

n.leaf = false;

}

return true;

});




// treeEditor.on('complete', function(o, newText, oldText) {

//  alert('    ,       ');

//  Ext.Ajax.request({

// url:'addchildnode.action',

// params:{

//     newname:newText,

// nodeId:currentId,

// oldname:oldValue

// }

//  });

// },this,true);

var pid;

var flag;

treeEditor.on("complete", function(treeEditor){

  alert(treeEditor.editNode.text);

  var ppid=pid==null?treeEditor.editNode.id:pid;

  var fflag=flag==null?'modify':flag;

          Ext.Ajax.request({

url:"addnode.action",

params:{

    newname:treeEditor.editNode.text,

    sign:fflag,

nodeId:ppid//              Id,           ID

}

 });

      });




//           

function treeContextHandler(node, event) {

event.preventDefault();//               ,             (        )

node.select();//         ,        

contextMenu.show(node.ui.getAnchor());

this.createrightClick(node).showAt(event.getXY());//           

}

//      

function addHandler() {

var newNode = new Ext.tree.TreeNode( {

text : '    '

});

var selectedNode = treepanel.getSelectionModel().getSelectedNode();

pid=selectedNode.id;

flag='add';

selectedNode.leaf = false;

selectedNode.expand(false, true, function() {

//   ,    expand       ,         ,     

selectedNode.appendChild(newNode);

treepanel.getSelectionModel().select(newNode);

setTimeout(function() {

treeEditor.editNode = newNode;

treeEditor.startEdit(newNode.ui.textNode);

}, 10);



});

}

function addBrotherHandler() {

var newNode = new Ext.tree.TreeNode( {

text : '    '

});

var selectedNode = treepanel.getSelectionModel().getSelectedNode();

var selectedParentNode = selectedNode.parentNode;

pid=selectedParentNode.id;

flag='add';

if (selectedParentNode == null) {

selectedNode.appendChild(newNode);

} else {

selectedParentNode.insertBefore(newNode, selectedNode);

}

setTimeout(function() {

treeEditor.editNode = newNode;

treeEditor.startEdit(newNode.ui.textNode);

}, 10);

}

function deleteHandler() {

var nodeid=treepanel.getSelectionModel().getSelectedNode().id;

var pnodeid=treepanel.getSelectionModel().getSelectedNode().parentNode.id;

//document.location.href="deletenode.action?nodeId="+nodeid+"&oldParentId="+pnodeid;

 alert(nodeid+"==="+pnodeid);

          Ext.Ajax.request({

url:'deletenode.action',

params:{

nodeId:nodeid,

oldParentId:pnodeid

}

 });

 treepanel.getSelectionModel().getSelectedNode().remove();



}

function modifyHandler() {

var selectedNode = treepanel.getSelectionModel().getSelectedNode();//        

pid=selectedNode.id;

flag='modify';

treeEditor.editNode = selectedNode;

treeEditor.startEdit(selectedNode.ui.textNode);

}

function viewHandler() {

var viewPanel = Ext.getCmp('tree-window-view');

var selectedNode = treepanel.getSelectionModel().getSelectedNode();

//        

var tmpid = selectedNode.attributes.id;

var tmpname = selectedNode.attributes.text;

var tmpdes = selectedNode.attributes.description;

var tmphref = selectedNode.attributes.href;




win.setTitle(tmpname + '   ');

win.show();




var dataObj = {

id : tmpid,

name : tmpname,

des : tmpdes,

href : tmphref

}

var tmpTpl = new Ext.Template(

['<div style="margin:10px"><div style="margin:10px">  :{id}</div>',

'<div style="margin:10px">  :{name}</div>',

'<div style="margin:10px">  :{des}</div>',

'<div style="margin:10px">  :{href}</div></div></div>' ]);

tmpTpl.overwrite(viewPanel.body, dataObj);

}

// function myEditor(editor, newValue, oldValue) {

// 

//// Ext.Ajax.request({

//// url:'addchildnode.action',

//// params:{

//// newname:newValue,

//// nodeId:currentId,

//// }

////     });

//     }   







});

 
以降の説明では、Extのほとんどがデータベースに関連していて変更が分からない場合は、トリガーイベントの処理方法に
Ext.Ajax.request({

 url:"addnode.action",

 params:{

     newname:treeEditor.editNode.text,

     sign:fflag,

 nodeId:ppid//              Id,           ID

 }

  });


 
このような非同期の要求はExtの中で随所に使うことができて、バックグラウンドの処理のコードについて私は貼らないで、みんなもすべて知っているべきで、パラメータを受け入れて、データを照会した後に
JSON形式のデータを転送するにはもちろんJSONデータ形式は[{name:'張三'},{age:34},{sex:'男'}]というデータ形式のJSONデータでなければなりません.私の木のコードが皆さんに役に立つことを望んでいます.少し乱れていますが、多くのコメントが落ちたコードも役に立ちます.コメントをキャンセルして効果を試してみてください.