2017-04-11 3 views
1

Ich habe ein Projekt mit dijit/Tree und dijit/tree/dndSource, wo der Benutzer Baumelemente per Drag & Drop verschieben kann, um Änderungen vorzunehmen. Ich verwende Dojo Release 1.10.4See jsfiddle hierDrag N Drop-Ereignis, wenn der Vorgang abgeschlossen ist

Dojo Tree w/drag and drop

Ich brauche eine Benachrichtigung zu haben, wenn der Tropfen vollständig ist. Es scheint, wie onDndDrop würde dieses Ereignis die offensichtliche Ort zu stoppen, aber die Dokumentation sagt, dass es mit diesem Ereignis nicht eine gute Idee, Chaos ist:

dojo/dnd documentation

Vom doc oben ...

Thema Prozessoren

Folgende Themenlistener sind definiert: onDndSourceOver, onDndStart, onDndDrop, onDndCancel. Diese Themen werden vom Manager veröffentlicht. Wenn Sie Themenlistener überschreiben möchten, lesen Sie bitte Zusammenfassung der Themen.

Summary of topics

Achtung: in den meisten Fällen möchten Sie Ereignisse verwenden. Themen sind Low-Level-Konstrukte, die intern verwendet werden und generell nicht für die Anpassung verwendet werden sollten.

--------- Ende doc -----------

Also, wie kann ich Benachrichtigung, wenn der Tropfen abgeschlossen, so kann ich einige Punkte auf die Aktualisierung Serverseite mit Ajax ?? onDndDrop Ereignis, das mit dijit/tree/dndSource Objekt verfügbar ist, was ich brauche, aber der Doc sagt, man sollte sich nicht damit befassen. In meinem Beispiel oben habe ich es auskommentiert //onDndDrop: treeDropEvt, auf der tree Objekt Erstellung. Wenn Sie dies der Baumerstellung hinzufügen, wird treeDropEvt aufgerufen, wenn der Benutzer ein Baumelement an eine andere Position im Baum verschiebt, aber Fehler können in der Konsole angezeigt werden, und die Verschiebung findet nicht statt.

Wenn ich onDndDrop Ereignis verwenden muss, wie gehe ich über die Erstellung, damit ich keine Fehler erhalte und es normal funktioniert ???

Antwort

0

Nach dem obigen Problem habe ich eine Lösung mit topic gefunden. Siehe meine Update jsfiddle hier:

Monitor onDrop event using topic

hinzufügen "dojo/topic" zur require Linie.

topic.subscribe("/dnd/drop",treeDropEvt2);

function treeDropEvt2(source, nodes, copy, target) { 
    console.log('treeDropEvt2'); 
    console.dir(source); 
    console.dir(nodes); 
    console.dir(copy); 
    console.dir(target); 
} 

Nachdem Sie diese Änderungen an meinem Projekt zu machen, funktioniert alles ohne Fehler OK und ich kann jetzt Ajax-Aufruf an den Server zurück während eines Drop-Ereignis machen. Beachten Sie, dass dieses Ereignis zu Beginn eines Abfalls ausgelöst wird und nicht, wenn es beendet ist.

UPDATE

Mit dieser Methode treeDropEvt2 während eines Falles Feuer scheint statt am Anfang des Tropfens zu sein, nachdem der Tropfen abgeschlossen ist. Nicht sicher, warum die Benachrichtigung über einen fertigen Tropfen ist so ein Schmerz? sehr frustrierend..

1

Ich mache das, was Sie in der pasteItem Funktion der TreeStoreModel tun möchten. TreeStoreModel ist der Speicher der Dojo-Struktur.

var memoryStore = new Memory({ 
      data: [{ 
       id: "root", 
       name: "ROOT", 
       loaded: true 
      }, ], 
      getChildren: function(object) { 
       return this.query({ 
        parent: object.id 
       }); 
      }, 
      clearOnClose:true 
     }); 

var myStore = new Observable(memoryStore); 

var myModel = new TreeStoreModel({ 
       store: myStore, 
       query: { 
        id: "root" 
       }, 
       labelAttr: "label", 
       pasteItem: function(child, oldParent, newParent, copy, insertIndex) { 
        // SEND NOTIFICATION, DO QUERIES 
       } 
      }); 

var tree = new Tree({ 
      model: myModel, 
      dndController: dndSource 
}); 
+0

Danke Stefano, werde dies überprüfen ... Ist 'TreeStoreModel' nicht mehr gültig ?? Wird überprüft, ob es ein pasteItem für 'ObjectStoreModel' gibt? – GoinOff

+0

Mit freundlichen Grüßen Ich weiß nicht, ob es veraltet ist. 'ObjectStoreModel' hat auch pasteItem, probiere das aus. [Doc] (https://dojotoolkit.org/reference-guide/1.10/dijit/tree/ObjectStoreModel.html) – Stefano

Verwandte Themen