dijit/Tree<\/A>, podrías simplemente usar elementos DOM regulares, tú eliges.<\/P><\/P>
Aquí hay algo de código que hace justo esto.<\/P>
define([\n 'dojo\/_base\declare',\n 'dojo\/_base\Deferred',\n 'dojo\/_base\on',\n 'dojo\/_base\topic',\n 'dojo\/_base\query',\n 'dojo\/_base\dom',\n 'dojo\/_base\dom-attr',\n 'put-selector',\n 'dojo\/_base\dom-class',\n 'dojo\/_base\Evented',\n 'esri/lang',\n '.\/_layerservice',\n 'dojox/lang/functional/curry',\n 'dijit\/_WidgetBase',\n 'dijit\/_TemplatedMixin',\n 'dojo/text!.\/_templates/layertoc.tpl.html'\n], function(\n declare, Deferred, on, topic,\n query, dom, domAttr, put, domClass,\n Evented, esriLang,\n getLayers, curry,\n _WidgetBase, _TemplatedMixin,\n template\n) {\n var labelName = curry(function(a, b) {\n if (b.label && b.label.length > 1) {\n return b.label;\n } else if (a.layerName && a.layerName.length) {\n return a.layerName;\n } else {\n return 'Elemento Capa';\n }\n });\n var sub = esriLang.substitute;\n var layertitle = '<span class=\\"pull-right\\">${title}</span>';\n return declare([_WidgetBase, _TemplatedMixin, Evented], {\n templateString: template,\n postCreate: function() {\n var node = dom.byId('map_root');\n put(node, this.domNode);\n var map = this.get('map');\n var layerIds = this.get('layerIds');\n \/ map over the layer ids and pull \u0000 \/ the layers designated as part of legend \u0000 \n this.tocLayers = map.layerIds.map(function(x) {\n if (layerIds.indexOf(x) > -1) {\n return map.getLayer(x);\n } else {\n return false;\n }\n  .&nbpsp;}).filter(function(a) { return a; });
{
var tbl = put(pbody, 'table.table');
// iterar sobre las capas y
// agregar elementos a la tabla
layers.map(function(a) {
var lbl = labelName(a);
var layerId;
var hasLayerId = false;
if (a.hasOwnProperty('layerId')) {
hasLayerId = true;
layerId = a.layerId;
}
// iterar sobre la leyenda y agregar elementos
 .& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; // a la fila de la tabla
 .& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; a.legend.map(function(b) {
 .& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; var tr = put(tbl, 'tr');
 .& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; if (hasLayerId) {
 .& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; hasLayerId = false;
 .& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; var lyrCheck = put(
 .& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 'span.glyphicon.glyphicon-ok' +
 .& nbsp. & nb sp ; & nb sp ; & nb sp ; & nb sp ; & nb sp ; & nb sp ; '.sublayer-item[data-layer-id=' + id + ']' +
 .& nb sp ; & nb sp ; & nb sp ; & nb sp ; & nb sp ; & nb sp ; '.[data-sublayer-id=' + layerId + ']'
 .& nb sp ; & nb sp ; & nb sp ; & nb sp ; & nb sp ; & nb sp ;
 .& nb sp );
 .& nb sp ; & nb sp ; & nb sp ; & nb sp ; put(tr, 'td', lyrCheck);
 .& nb sp ; } else {
 .& nb sp ; put(tr, 'td');
 .& nb sp ; }
 .& nb sp ; var td1 = put(tr, 'td.layer-image');
 .& nb sp ; put(tr, 'td', {
 .& nb sp ; innerHTML: lbl(b)
 .& nb sp ; });
 .& nb sp ; // Solo agrego la imagen base64, pero también podrías
 .& nb sp ; // usar la URL de la imagen proporcionada en el endpoint Legend
 .& nb sp ; put(td1, 'img', {
 .& nb sp ; src: 'data:image/png;base64,' + b.imageData
 .& nb sp ; });
 .& nb sp });
 .& nb sp });
 . }, function(err) { console.debug('error in request', err); });
 . }
});
});Vaya, eso es mucho código. Oye, querías aprender sobre un widget ToC, eso va a tomar un poco de código. Agregué algunos comentarios para ayudarte. Podrías dividir parte de la funcionalidad en módulos más pequeños, pero eso lo dejo a tu criterio.
Estoy usando