2012-05-24 2 views
40

Meteor dispone di una sessione che fornisce un oggetto globale sul client che è possibile utilizzare per memorizzare un insieme arbitrario di coppie chiave-valore. Usalo per memorizzare cose come l'elemento attualmente selezionato in un elenco.Come eliminare o rimuovere le variabili di sessione?

Supporta Session.set, Session.get e Session.equals.

Come si elimina un nome di sessione, coppia di valori? Non riesco a trovare un Session.delete (nome)?

risposta

58

[Nota: questa risposta è per Meteor 0.6.6.2 attraverso almeno 1.1.0.2]

[edit: aggiornato per spiegare anche come fare questo, pur non rompendo reattività. Grazie a @DeanRadcliffe, @AdnanY, @TomWijsman, e @MikeGraf]

I dati vengono memorizzati all'interno Session.keys, che è semplicemente un oggetto, in modo da poter eliminare manualmente le chiavi:!

Session.set('foo', 'bar') 
delete Session.keys['foo'] 

console.log(Session.get('foo')) // will be `undefined` 

Per eliminare tutti i tasti, si può semplicemente assegnare un oggetto vuoto per Session.keys:

Session.set('foo', 'bar') 
Session.set('baz', 'ooka!') 
Session.keys = {} 

console.log(Session.get('foo')) // will be `undefined` 
console.log(Session.get('baz')) // will be `undefined` 

Questo è il modo più semplice. Se vuoi assicurarti che tutte le dipendenze reattive siano elaborate correttamente, assicurati di fare anche qualcosa di simile a ciò che @ dean-radcliffe suggerisce nel primo commento. Utilizzare per impostare prima le chiavi non definite, quindi eliminarle manualmente. Come questo:

// Reset one value 
Session.set('foo', undefined) 
delete Session.keys.foo 

// Clear all keys 
Object.keys(Session.keys).forEach(function(key){ Session.set(key, undefined); }) 
Session.keys = {} 

Ci saranno ancora alcuni resti della cosa in Session.keyDeps.foo e Session.keyValueDeps.foo, ma che non dovrebbe mettersi in cammino.  

+4

Non è consigliabile andare sotto le copertine di 'Session' e manipolare le chiavi direttamente. Puoi comunque usarlo per ogni nome di chiave: 'Object.keys (Session.keys) .forEach (function (key) {Session.set (key, undefined);})' –

+1

Ottimo punto @DeanRadcliffe, ha aggiornato la risposta. – jpadvo

+2

@DeanRadcliffe, molte grazie per il tuo contributo. In realtà stavo seguendo [questo anwser] (http://stackoverflow.com/a/28803605/877353) (che ho modificato ora), e non riuscivo a capire perché la reattività fosse sparita. Senza il tuo contributo, avrei vagato per secoli. Sei forte. Grazie tante! –

18

Session.set('name', undefined) o Session.set('name', null) dovrebbe funzionare.

+1

Lo elimina effettivamente o imposta semplicemente il valore su indefinito o nullo? –

+1

@SteeveCannon: No, in realtà non lo elimina; ma renderebbe 'Session.get ('name')' return undefined o null. Penso che quando 'Session.get ('name')' non è stato ancora usato, anch'esso ritornerebbe indefinito. Non vedo alcuna necessità di eliminare effettivamente la variabile, almeno non in un contesto reattivo. Per immagazzinamento non reattivo dovresti probabilmente usare qualcosa come amplificare (persistente) o solo alcune variabili (temporanee). –

+0

funziona se lo si imposta su undefined. Non ho provato a impostarlo su null. La coppia chiave/valore di sessione non scompare immediatamente ma pochi istanti dopo lo fa. Deve essere correlato al gc. Grazie –

6

Lo svantaggio con l'utilizzo di delete Session.keys ['foo'] è che il tuo modello non si ricarica di nuovo se la chiave di sessione contiene un array. Per esempio, se si sta facendo

Template.mytempl.helpers({ 
    categories: function() { 
     return Session.get('srch-categories') 
    } 
}) 

e nel modello

{{#if categories}} 
    {{#each categories}} 
     {{this}} 
    {{/each}} 
{{/if}} 

e categorie è un array, se si elimina la chiave di sessione, il modello continua a visualizzare l'ultimo valore di categorie.