Muchas herramientas nos permiten manipular el DOM (jQuery, y la API nativa del DOM, entre otras). La principal característica de D3 es que nos permite vincular elementos del DOM con elementos de datos. Por ejemplo, tenemos tres items en una lista:
Estos elementos no tienen datos vinculados. Podemos vincular cada uno de estos elementos con un elemento de un arreglo de datos usando data()
:
Si inspeccionamos estos elementos, veremos que tienen una nueva propiedad: el attributo __data__
. Pero, visualmente, no pasó nada.
Ahora, podemos usar los datos para modificar los atributos del elemento del DOM. Por ejemplo, podemos cambiar el color de los ítems de la lista usando el atributo color
del dato asociado a cada uno de ellos.
Dependiendo del tipo de elemento del DOM, se puede usar attr
para modificar los atributos, style
para propiedades de estilo, text
o html
para contenido. Por ejemplo, ahora podemos alterar el contenido del elemento de lista.
enter()
Esto funciona bien si los elementos del DOM existen y coinciden con el número de datos. Si hay más datos que elementos del DOM, se crea una selección especial llamada enter()
. Esta selección tiene elementos del DOM provisionales, que pueden ser creados usando esta selección.
Ahora tenemos dos elementos del DOM, y el mismo arreglo de datos. Podemos vincular los elementos del DOM con los elementos de los datos.
La selección list.enter()
contiene una referencia a los elementos de lista no creados. Podemos usar esta selección para crear los elementos.
El nuevo elemento fue creado, y además configuramos su contenido para que use los datos. Notar que el resto de los elementos no ha sido actualizado. Una vez creado el elemento, está disponible en la variable list
, y puede ser actualizado con el resto de los elementos.
exit()
.También puede ocurrir el caso contrario, que hay más elementos del DOM que elementos de datos. Los elementos restantes quedan almacenados en una selección especial llamada exit, que usaremos para remover los elementos.
Al vincular cuatro elementos del DOM con tres elementos de datos, un elemento quedará en la selección exit()
.
Podemos usar esta selección para remover el elemento que no tiene datos. Notar que la selección funciona casi igual que el resto, podemos alterar los atributos de los elementos del DOM (pero sin usar datos, porque no tienen).
También podemos simplemente eliminarlos.
Normalmente, el código D3 debe manejar estas tres situaciones, enter
, update y exit
. Ejecutando correctamente esta secuencia asegura que los datos y el DOM estén sincronizados.
Hasta ahora, hemos usado la posición de los elementos del DOM y la posición de los elementos en el arreglo para determinar la correspondencia entre ellos. Esto puede generar problemas, por ejemplo, vamos a crear una lista nueva usando datos.
Ahora, supongamos que queremos vincular estos elementos con otro arreglo, que tiene un elemento menos. El mismo código debería funcionar, eliminando el elemento del DOM.
Se eliminó el último elemento del DOM, independientemente del contenido. Sin embargo, era razonable esperar que el elemento con texto París
hubiera desaparecido. Esto ocurre porque no hemos especificado la correspondencia entre elementos del DOM y elementos de datos. Queremos que al actualizar los datos, los elementos cuyo texto
aparece en algún elemento de dato sean actualizados, y los demás sean eliminados. Para lograr esto, necesitamos especificar qué atributo de los datos es el ID o key.
Ahora, si eliminamos un dato, se elimina el elemento del DOM correspondiente.