2012-05-24 3 views
40

Метеор имеет сеанс, который предоставляет глобальный объект на клиенте, который вы можете использовать для хранения произвольного набора пар ключ-значение. Используйте его для хранения таких вещей, как текущий выбранный элемент в списке.Как удалить или удалить переменные сеанса?

Он поддерживает Session.set, Session.get и Session.equals.

Как удалить имя сеанса, пару значений? Я не могу найти Session.delete (имя)?

ответ

58

[Примечание: этот ответ на Метеоре 0.6.6.2 по крайней мере 1.1.0.2]

[редактировать: обновлен также объяснить, как сделать это в то время, не нарушая реактивность. Благодаря @DeanRadcliffe, @AdnanY, @TomWijsman и @MikeGraf]

Данные хранятся внутри Session.keys, который является просто объектом, так что вы можете вручную удалить ключи:

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

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

Чтобы удалить все ключи, вы можете просто присвоить пустой объект 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` 

Это самый простой способ. Если вы хотите убедиться, что любые реактивные зависимости обработаны правильно, убедитесь, что вы также делаете что-то вроде того, что предлагает @ dean-radcliffe в первом комментарии. Используйте Session.set(), чтобы сначала установить ключи в undefined, а затем вручную удалить их. Как это:

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

Там еще будут какие-то остатки вещи в Session.keyDeps.foo и Session.keyValueDeps.foo, но это не должно мешать.  

+4

Не рекомендуется проходить под обложками 'Session' и напрямую манипулировать ключами. Однако вы можете использовать его для каждого имени ключа: 'Object.keys (Session.keys) .forEach (function (key) {Session.set (key, undefined);})' –

+1

Очень хорошая точка @DeanRadcliffe, обновил ответ. – jpadvo

+2

@DeanRadcliffe, большое спасибо за ваш вклад. Я действительно следовал [этому anwser] (http://stackoverflow.com/a/28803605/877353) (который я редактировал сейчас), и не мог найти, почему реактивность исчезла. Без вашего вклада я бы бродил целую вечность. Ты жжешь. Большое спасибо! –

18

Session.set('name', undefined) или Session.set('name', null) должно работать.

+1

Это действительно удаляет его или просто задает значение undefined или null? –

+1

@SteeveCannon: Нет, он фактически не удаляет его; но это сделает 'Session.get ('name')' return undefined или null. Я думаю, что, когда 'Session.get ('name')' еще не был использован, он также будет возвращен не определен. Я не вижу необходимости фактически удалять переменную, по крайней мере, не в реактивном контексте. Для нереактивного хранения вы, скорее всего, будете использовать что-то вроде amplify (persistent) или просто некоторую переменную (временную). –

+0

работает, если вы установите его на неопределенный. Я не тестировал установку нулевого значения. Пара ключей/значений сеанса не исчезает сразу, а через несколько секунд. Должно быть связано с gc. Спасибо –

6

Недостаток использования delete Session.keys ['foo'] заключается в том, что ваш шаблон не будет перезагружать, если ключ сеанса содержит массив. Например, если вы делаете

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

и в шаблоне

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

и категории является массивом, при удалении ключа сеанса, ваш шаблон будет продолжать отображать последнее значение категорий.

Смежные вопросы