2012-05-03 15 views
7

Come evitare conflitti con altri plugin jQuery utilizzando $.data()?jQuery.data() namespace

stavo pensando che potrei usare una sola chiave per memorizzare i miei dati come

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

e accedervi come $(el).data('myplugin').foo ecc

Ma come si può facilmente modificare un valore, senza sostituire l'intero dati? Come cambiare il valore di "foo".

risposta

7

Perché non utilizzare

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

e

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

?

Quindi, se non è necessario accedere a più di un valore allo stesso tempo, si evitano le analisi e le prove inutili.

+0

Il * .key * deve essere al di fuori del() s – m90

+0

@ m90: Sta suggerendo di nominare letteralmente la chiave "" myplugin.foo "' . –

+0

@Rocket non ha mai pensato di avere un * var.iable *. Sai se questa sarebbe una sintassi valida? – m90

7

Basta modificare la proprietà che si desidera modificare.

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 

Per quanto riguarda i conflitti di namespace, una soluzione è quella di generare un timestamp in fase di esecuzione (quando viene definito il plugin) e l'uso che timestamp nello spazio dei nomi. Non è ancora protetto al 100% dai conflitti nei browser più veloci, ma si avvicina molto.

+0

+1 funziona perché l'oggetto è un riferimento :-) –

+0

funziona perché l'oggetto è un riferimento, avrei dovuto farlo prima :( Stavo evitando questo approccio solo perché pensavo che avrei dovuto fare, 'var data = el.data (" myPlugin "); data.foo =" bar "; el.data (" myPlugin ", dati);' +1 Kevin. – Jashwant

3

Personalmente utilizzo una convenzione di denominazione separata da trattino che prefigura nomi di classi, ID, proprietà dei dati, ecc. Con un identificatore abbreviato dell'entità proprietaria del codice e uno per l'area di funzionalità.

Se mi stavano lavorando su un programma grafico per azienda Foo, il mio prefisso potrebbe essere:

foo-chart- 

Questo mi permette di fare tutti gli identificatori aziendali unici per l'azienda, e le aree di codice univoco gli uni agli altri (in modo da evitare la collisione con altri sviluppatori in altre aree di funzionalità).

esempio inventato:

<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> 

Trovo usando un trattino si adatta bene con quasi tutto il posto sarebbero necessari i miei identificatori - sia come valore attr markup o nome, o nel codice, etc Puoi usare qualsiasi carattere che soddisfi le tue esigenze (. è molto comune)

+1

Me 3. È particolarmente evidente nel bootstrap ja moduli vascript 'data-slide' 'data-slide-to'. Namespacing appare anche negli eventi ma con periodi 'slid.bs.carousel'. –