Daar ben je in principe helemaal vrij in. In mijn geval voer ik serverside een move uit in de database voor die node, ik moet immers serverside parentid's veranderen. Wat ik dus doe is drag n drop van een node, de draggingNode mag dan verwijderd worden, en de node waarna je toe sleept ga ik reloaden omdat ik ook nog extra informatie heb in mijn xml bestand over het soort object. Je kunt dus ook per treeview en eigen handler eraan hangen als je dit wilt, zodat je per treeview op een andere manier de drag n drop afhandelt.
Ik doe dus als volgt:
begin het draggen van een node:
function onNodeDragStart(draggingNode){
if(draggingNode.isRoot()){
// make sure the drag is cancelled before anything else
draggingNode.treeview.cancelDrag();
alert('Root mag niet gedragged worden');
return false;
}
return true;
}
Waarmee ik dus een referentie krijg naar de draggingNode als attribute, en vervolgens controleer ik of de node niet de root node is, die wil ik niet draggen nl. en vervolgens return ik een true of false die aangeeft of ik de node wel of niet mag gaan draggen.
Zodra ik de draggingNode ergens in dump:
function onNodeDragEnd(targetNode){
//instance,oldparent,newparent
var instance = draggingNode.getXMLAttribute('instanceid');
var oldparent = draggingNode.getXMLAttribute('parentid');
var newparent = targetNode.getXMLAttribute('instanceid');
/*
if(targetNode.getXMLAttribute('objectname').toLowerCase() == 'article'){
alert('An article cannot contain subitems');
return;
}
if(newparent == instance){
alert('object cannot be moved to itself');
return;
}
*/
// we set the true parameter here, because if we wouldn't do this, the parentNode of the selectedNode
// would be selected, and thus the targetNode would be overwritten with the parentNode
draggingNode.remove(true);
//moveInstance(instance,oldparent,newparent);
}
de variabelen instance, oldparent en newparent,objectname heb ik serverside in het xml bestand bij de node geplaatst. Deze haal ik dus op met draggingNode.getXMLAttribute(een xml attribuut); en daarna controleer ik of er in mijn geval mag worden doorgegaan met het moven van de node. Ik mag bijvoorbeeld niet in een artikel iets draggen.
Vervolgens wordt draggingNode.remove(true); uitgevoerd, die de te draggen node uit de treeview verwijderd. De true attribute voorkomt dat er na het verwijderen automatisch een parentNode wordt geselecteerd, want dan wordt ook de targetNode op die parentNode gezet.
en vervolgens voer ik mijn eigen moveInstance functie uit, die serverside de boel verplaatst.
Je bent er in principe helemaal vrij in. Er zitten een aantal handlers in die worden uitgevoerd bij drag n drop, waarmee je dus ook voortijdig drag n drop zou kunnen afbreken. Je krijgt dan de beschikking over een draggingNode (referentie naar de node die je dragged) en een targetNode (referentie naar de node die je draggingNode ontvangt op het moment dat je deze dumpt).
Je krijgt de beschikking over bouwstenen waarmee je snel functionaliteit uitvoert. Ik zou ook niet weten wat je moet doen met het direct verplaatsen van de node. Het zou meer nadelen dan voordelen opleveren, immers je moet aan iets op de server doorgeven dat je hebt verplaatst, en zodra je dat hebt gedaan kan er ook iets aan de andere childs op dat niveau zijn veranderd mbt order etc.
De handlers kun je definieren op de treeview, als je ze niet definieert worden de default handlers, gedefinieerd in core.js bovenin uitgevoerd, en deze doen dus niets.
var mytreeview = new treeview('mijn treeview',document.getElementById('treeviewwrap'),'tree.xml');
mytreeview.onNodeSelectEventHandler = onNodeSelect;
mytreeview.onNodeDragStartHandler = onNodeDragStart;
mytreeview.onNodeDragEndHandler = onNodeDragEnd;
nb: als je een node over een dichtgeklapte node sleept, zal de dichtgeklapte node na ong. 1 seconde automatisch uitklappen.
Ik had voor de rest ook wel wat aandacht besteed aan vriendelijke error messages. Als je dus een node selecteerd met index 7 maar er zijn er maximaal 5, dan krijg je dus een nette melding. Er is niets irritanters bij de ontwikkeling van web applicaties dat je js errors krijgt als je dit soort fouten maakt.
[
Voor 18% gewijzigd door
Verwijderd op 21-01-2005 13:30
]