2012-05-24 23 views
40

Meteor tiene una sesión que proporciona un objeto global en el cliente que puede usar para almacenar un conjunto arbitrario de pares clave-valor. Úselo para almacenar elementos como el elemento seleccionado actualmente en una lista.¿Cómo elimino o elimino las variables de sesión?

Es compatible con Session.set, Session.get y Session.equals.

¿Cómo elimino un nombre de sesión, par de valores? No puedo encontrar una Session.delete (nombre)?

Respuesta

58

[Nota: esta respuesta es para Meteor 0.6.6.2 través de al menos 1.1.0.2]

[editar: actualizado para explicar también cómo hacer esto sin romper la reactividad. Gracias a @DeanRadcliffe, @AdnanY, @TomWijsman y @MikeGraf]

Los datos se almacenan en el interior Session.keys, que es simplemente un objeto, por lo que puede eliminar manualmente las claves:!

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

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

Para borrar todo las teclas, simplemente puede asignar un objeto vacío a 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` 

Esa es la forma más simple. Si quiere asegurarse de que las dependencias reactivas se procesen correctamente, asegúrese de hacer algo como lo que @ dean-radcliffe sugiere en el primer comentario. Use Session.set() para establecer primero las claves indefinidas y luego elimínelas manualmente. De esta manera:

// 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 = {} 

Todavía habrá algunos restos de la cosa en Session.keyDeps.foo y Session.keyValueDeps.foo, pero que no debe ponerse en el camino.  

+4

No es aconsejable pasar por debajo de las cubiertas de 'Session' y manipular claves directamente. Sin embargo, puede usarlo para cada nombre de clave: 'Object.keys (Session.keys) .forEach (function (key) {Session.set (key, undefined);})' –

+1

Muy buen punto @DeanRadcliffe, actualizó la respuesta. – jpadvo

+2

@DeanRadcliffe, muchas gracias por su contribución. De hecho, estaba siguiendo [este artículo] (http://stackoverflow.com/a/28803605/877353) (que edité ahora) y no pude encontrar por qué desapareció la reactividad. Sin su contribución, habría vagado durante siglos. Tu rock ¡Muchas gracias! –

18

Session.set('name', undefined) o Session.set('name', null) debería funcionar.

+1

¿Eso realmente lo elimina o simplemente establece el valor en indefinido o nulo? –

+1

@SteeveCannon: No, en realidad no lo elimina; pero haría 'Session.get ('name')' return undefined o null. Creo que cuando 'Session.get ('nombre')' aún no se haya utilizado, también volverá indefinido. No veo ninguna necesidad de eliminar realmente la variable, al menos no en un contexto reactivo. Para el almacenamiento no reactivo, lo más probable es que utilice algo como amplificar (persistente) o simplemente alguna variable (temporal). –

+0

funciona si lo configura en indefinido. No he probado establecerlo en nulo. El par de clave/valor de sesión no desaparece inmediatamente, pero momentos después lo hace. Debe estar relacionado con el gc. Gracias –

6

La desventaja de utilizar delete Session.keys ['foo'] es que su plantilla no se cargará en caliente si la clave de sesión contiene una matriz. Por ejemplo, si usted está haciendo

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

y en su plantilla

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

y categorías es una matriz, si se elimina la clave de sesión, la plantilla se seguirá mostrando el último valor de categorías.

Cuestiones relacionadas