2012-05-03 11 views
7

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

Estaba pensando que podría utilizar una sola llave para almacenar mis datos como

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

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

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

Respuesta

7

Por qué no usar

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

y

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

?

De modo que si no necesita acceder a más de un valor al mismo tiempo, evitará indirecciones y pruebas inútiles.

+0

La * .key * necesita estar fuera de() s – m90

+0

@ m90: Sugiere literalmente nombrar la clave '" myplugin.foo "' . –

+0

@Rocket nunca pensó en tener * var.iable *. ¿Sabes si esto sería una sintaxis válida? – m90

7

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 plug-in) y el uso de esa marca de tiempo en el espacio de nombres. Todavía no está 100% protegido contra los conflictos en los navegadores más rápidos, pero se acerca bastante.

+0

+1 esto funciona porque el objeto es un referencia :-) –

+0

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

3

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

Si estuviera trabajando en un programa de diagrama para la compañía de Foo, mi prefijo podría ser:

foo-chart- 

Esto me permite hacer todos los identificadores de compañía única a la empresa, y las áreas de código único a cada otra (para evitar colisionar con otros desarrolladores en otras áreas de funcionalidad).

ejemplo artificioso:

<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 usando un guión encaja bien con casi cualquier lugar se necesitarían mis identificadores - ya sea como un valor attr marcado o nombre, o en el código, etc. .Puede usar cualquier char que se adapte a sus necesidades (. es muy común)

+1

Yo tres. Es particularmente evidente en el bootstrap ja módulos vascript 'data-slide'' data-slide-to'. El espaciado de nombres también aparece en los eventos pero con los períodos 'slid.bs.carousel'. –