2012-05-24 3 views
40

Meteor verfügt über eine Sitzung, die ein globales Objekt auf dem Client bereitstellt, mit dem Sie eine beliebige Gruppe von Schlüssel/Wert-Paaren speichern können. Verwenden Sie es, um Dinge wie das aktuell ausgewählte Element in einer Liste zu speichern.Wie lösche oder entferne ich Sitzungsvariablen?

Es unterstützt Session.set, Session.get und Session.equals.

Wie lösche ich einen Session-Namen, Wert-Paar? Ich kann kein Session.delete (Name) finden?

Antwort

58

[Anmerkung: Diese Antwort ist für Meteor 0.6.6.2 durch mindestens 1.1.0.2]

[edit: aktualisiert auch zu erklären, wie diese zu tun, während nicht Reaktivität zu brechen. Dank @DeanRadcliffe, @AdnanY, @TomWijsman und @MikeGraf]

Die Daten innerhalb Session.keys gespeichert ist, was einfach ein Objekt ist, so dass Sie die Schlüssel manuell löschen:

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

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

alle löschen

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` 

das ist der einfachste Weg: die Tasten, können Sie einfach ein leeres Objekt zu Session.keys zuweisen. Wenn Sie sicherstellen möchten, dass alle reaktiven Abhängigkeiten korrekt verarbeitet werden, stellen Sie sicher, dass Sie auch etwas tun, was @ dean-radcliffe im ersten Kommentar vorschlägt. Verwenden Sie Session.set(), um die Schlüssel zuerst auf undefiniert zu setzen und dann manuell zu löschen. Wie folgt aus:

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

Es wird noch einige Reste der Sache in Session.keyDeps.foo und Session.keyValueDeps.foo, aber das sollte nicht in die Quere kommen.  

+4

Es ist nicht ratsam, unter die Abdeckungen von 'Session' zu gehen und Schlüssel direkt zu manipulieren. Sie können es jedoch für jeden Schlüsselnamen verwenden: 'Object.keys (Session.keys) .forEach (Funktion (key) {Session.set (Schlüssel, undefined);})' –

+1

Sehr guter Punkt @DeanRadcliffe, aktualisiert die Antwort. – jpadvo

+2

@DeanRadcliffe, vielen Dank für Ihren Beitrag. Ich folgte tatsächlich [diese Anwers] (http://stackoverflow.com/a/28803605/877353) (die ich jetzt bearbeitet habe) und konnte nicht herausfinden, warum die Reaktivität weg war. Ohne Ihren Beitrag wäre ich seit Ewigkeiten gewandert. Du schaukelst. Vielen Dank! –

18

Session.set('name', undefined) oder Session.set('name', null) sollte funktionieren.

+1

Löscht das tatsächlich oder nur den Wert auf undefined oder null? –

+1

@SteeveCannon: Nein, es löscht es nicht wirklich; aber es würde 'Session.get ('name')' unbestimmt oder null zurückgeben. Ich denke, wenn 'Session.get ('name')' noch nicht benutzt wurde, würde es auch undefiniert zurückkommen. Ich sehe keine Notwendigkeit, die Variable tatsächlich zu löschen, zumindest nicht in einem reaktiven Kontext. Für nicht reaktiven Speicher sollten Sie am ehesten etwas wie amplify (persistent) oder nur eine Variable (temporary) verwenden. –

+0

es funktioniert, wenn Sie es auf undefiniert festlegen. Ich habe nicht getestet, es auf null zu setzen. Das Sitzungsschlüssel-Wert-Paar verschwindet nicht sofort, aber wenige Augenblicke später. Muss mit dem GC verwandt sein. Danke –

6

Der Nachteil beim Verwenden von delete.Session.keys ['foo'] ist, dass Ihre Vorlage nicht neu geladen wird, wenn der Sitzungsschlüssel ein Array enthält. Zum Beispiel, wenn Sie

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

und in der Vorlage

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

und Kategorien tun, ist ein Array, wenn Sie den Sitzungsschlüssel, die Vorlage löschen wird auch weiterhin den letzten Wert der Kategorien angezeigt werden soll.