espacio de nombres jQuery.data()

¿Cómo puedo evitar conflictos con otros complementos de jQuery usando $.data()?

Estaba pensando que podría usar una sola clave para almacenar mis datos como

$(el).data('myplugin', { foo: 'a', xyz: 34});

y acceder a él como $(el).data('myplugin').foo etc.

Pero, ¿cómo se puede cambiar fácilmente un valor sin anular todos los datos? Como cambiar el valor de "foo".

preguntado el 03 de mayo de 12 a las 19:05

3 Respuestas

Por qué no usar

$(el).data('myplugin.foo')

y

$(el).data('myplugin.xyz')

?

Por lo tanto, si no necesita acceder a más de un valor al mismo tiempo, evitará pruebas e indirectas inútiles.

contestado el 03 de mayo de 12 a las 19:05

La .key debe estar fuera de ()s - m90

@m90: está sugiriendo nombrar literalmente la clave "myplugin.foo". - Cohete Hazmat

@Rocket ni siquiera pensó en tener un variable. ¿Sabes si esta sería una sintaxis válida? - m90

@ m90 Simplemente no puedes usarlo directamente. Tiene que ser referenciado usando notación de matriz como lo que está en la respuesta de dystroy o $(el).data()['myplugin.foo']. $(el).data().myplugin.foo arrojaría un error debido a myplugin no está definido en el objeto de datos. - Kevin B

¡Gracias! ¿Sabes cómo puedo eliminar solo mis datos cuando llamo a $.removeData() ? - Alex

Simplemente cambie la propiedad que desea cambiar.

http://jsfiddle.net/rQQdf/

var el = $("<div />");    
el.data("myPlugin",{ foo: "foo" });
console.log(el.data("myPlugin").foo); // foo
el.data("myPlugin").foo = "bar";
console.log(el.data("myPlugin").foo); // bar

En cuanto a los conflictos de espacio de nombres, una solución es generar una marca de tiempo en tiempo de ejecución (cuando se define el complemento) y usar esa marca de tiempo en su espacio de nombres. Todavía no está 100% protegido contra conflictos en los navegadores más rápidos, pero se acerca bastante.

contestado el 03 de mayo de 12 a las 19:05

esto funciona porque el objeto es una referencia, debería haberlo pensado antes :( Estaba evitando este enfoque solo porque pensé que tendría que hacerlo, var data = el.data("myPlugin"); data.foo = "bar"; el.data("myPlugin",data); +1 Kevin. - Jashwant

Yo personalmente uso una convención de nomenclatura separada por guiones que antepone nombres de clase, ID, propiedades de datos, etc. con un identificador abreviado de la entidad propietaria del código y uno para el área de funcionalidad.

Si estuviera trabajando en un programa de gráficos para la empresa Foo, mi prefijo podría ser:

foo-chart-

Esto me permite hacer que todos los identificadores de la empresa sean únicos para la empresa y que las áreas de código sean únicas entre sí (para evitar colisiones con otros desarrolladores en otras áreas de funcionalidad).

Ejemplo elaborado:

<button id="foo-chart-refresh" class="foo-chart-interact" data-foo-chart-last="201205031421">Refresh Chart</button>
<script type="text/javascript">
    var lastRefresh = $('#foo-chart-refresh').data('fooChartLast'); // see docs on .data() for case/hyphenation handling
</script>

Encuentro que usar un guión encaja bien con casi cualquier lugar en el que se necesiten mis identificadores, ya sea como un valor de atributo de marcado or nombre, o en código, etc. Puede usar cualquier carácter que se ajuste a sus necesidades (. Es muy común)

contestado el 03 de mayo de 12 a las 19:05

Mi tres. Es particularmente evidente en los módulos javascript de arranque. data-slide data-slide-to. El espacio de nombres también aparece en los eventos pero con puntos. slid.bs.carousel. - Phil Cooper

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.