2012-11-18 12 views
9

Unsere Firma wechselte von dojox/DataGrid zu dgrid einige Zeit zurück. Jetzt stellen wir fest, dgrid scheint dijit/dojox widgets nicht von der Box zu unterstützen.Widgets in dojo dgrid

dojox/DataGrid hat eine formatter(), die ein Widget zurückgeben kann. So einfach ist es dort zu doofen! Die API comparison on GitHub sagt

„D-Grid-Formatierungsfunktionen unterstützt, unterstützt aber nicht ein Widget Rückkehr von ihnen auch renderCell hat .dgrid, die return ein DOM-Knoten erwartet wird. Dies könnte angeblich für Anzeigen verwendet werden, Widgets (und das Editor-Spalten-Plugin tut genau dies). Beachten Sie, dass für die Bearbeitung von Zellen, Verwendung der Editor-Spalte Plugin ist sehr ermutigt. "

Wie genau?

Ich habe versucht, das Editor-Plugin mit {editor: ' ', editorArgs:' '} zu verwenden. Dies macht ein Widget aber ist zu restriktiv. ZB Wie rende ich eine dijit/Button mit seiner Bezeichnung der Wert der Zelle? Oder etwas komplizierter, wie verwende ich eine (weniger bekannte) dojox/image/MagnifierLite mit einer generiert von einer Formatierungsfunktion mit der src ist der Wert des Geschäfts?

Antwort

14

können Sie diesen Beispielcode

require(
    [ 
     "dgrid/List", 
     "dgrid/OnDemandGrid", 
     "dgrid/Selection", 
     "dgrid/editor", 
     "dgrid/Keyboard", 
     "dgrid/tree", 
     "dojo/_base/declare", 
     "dojo/store/JsonRest", 
     "dojo/store/Observable", 
     "dojo/store/Cache", 
     "dojo/store/Memory", 
     "dijit/form/Button", 
     "dojo/domReady!" 
    ], 

    function(
     List, 
     Grid, 
     Selection, 
     editor, 
     Keyboard, 
     tree, 
     declare, 
     JsonRest, 
     Observable, 
     Cache, 
     Memory, 
     Button 
    ) { 

     var columns = [ 
      { 
       label:"Actions", 
       field:"id", 
       width: "200px", 
       renderCell: actionRenderCell 
      } 
     ]; 

     var actionRenderCell = function (object, data, cell) { 

      var btnDelete = new Button({ 
       rowId : object.id, 
       label: "Delete", 
       onClick: function() { 
        myStore.remove(this.rowId); 
       } 
      }, cell.appendChild(document.createElement("div"))); 

      btnDelete._destroyOnRemove = true; 

      return btnDelete; 

     } 

     grid = new (declare([Grid, Selection, Keyboard]))({ 
      store: myStore, 
      getBeforePut: false, 
      columns: columns 
     }, "grid"); 

} 
+0

Ja nutzen! Das funktioniert! Vielen Dank! In Ihrem Beispiel verwenden Sie renderCell wie formatter in dojox/DataGrid. Die Dokumentation für Dgrid besagt, dass, wenn Formatierung und renderCell beide angewendet werden, Formatierer ignoriert wird. Irgendeine Idee, warum es so entworfen wird? –

+3

Dieser Code funktioniert, aber ich bin ziemlich sicher, dass es einen Speicherverlust hat. [Um dies zu vermeiden, benutze removeRow] (https://github.com/SitePen/dgrid/blob/v0.3.15/doc/usage/Working-with-Widgets.md#destroying-rendered-widgets) – sixtyfootersdude