如何删除或删除会话变量?

Ste*_*non 42 meteor

Meteor有一个Session,它在客户端上提供一个全局对象,可用于存储任意一组键值对.用它来存储列表中当前所选项目之类的内容.

它支持Session.set,Session.get和Session.equals.

如何删除会话名称,值对?我找不到Session.delete(名字)?

jpa*_*dvo 61

[注意:这个答案适用于Meteor 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`
Run Code Online (Sandbox Code Playgroud)

要删除所有键,只需将空对象分配给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`
Run Code Online (Sandbox Code Playgroud)

这是最简单的方法.如果您想确保正确处理任何反应依赖关系,请确保您还执行@ 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 = {}
Run Code Online (Sandbox Code Playgroud)

仍然会有的东西一些残部Session.keyDeps.fooSession.keyValueDeps.foo,但不应该成为障碍. 

  • 不建议在"Session"的封面下直接操作键.但是,您可以将它用于每个键名:`Object.keys(Session.keys).forEach(function(key){Session.set(key,undefined);})` (4认同)
  • @DeanRadcliffe,非常感谢您的贡献.我实际上正在关注[这个anwser](http://stackoverflow.com/a/28803605/877353)(我现在编辑),并且无法找到为什么反应性消失了.没有你的贡献,我会徘徊多年.你摇滚.十分感谢! (2认同)

Tam*_*man 19

Session.set('name', undefined)或者Session.set('name', null)应该工作.

  • 这次谈话在IRC继续进行.摘要:GC删除时间取决于浏览器,即GC是否正在运行.Session.delete()应该被实现...... (2认同)
  • 由于Session.setDefault()的工作原理,此解决方案失败.`Session.set('a','a'); Session.set('a',undefined); Session.setDefault('a','b'); Session.get( 'A'); => undefined``delete Session.keys.a`解决方案不会遇到同样的问题.(目前正在使用7.2.x版进行测试) (2认同)

Adn*_*n Y 6

使用delete Session.keys ['foo']的缺点是,如果会话密钥包含数组,则模板不会热重新加载.例如,如果你在做

Template.mytempl.helpers({
    categories: function() {
        return Session.get('srch-categories')
    }
})
Run Code Online (Sandbox Code Playgroud)

并在您的模板中

{{#if categories}}
    {{#each categories}}
        {{this}}
    {{/each}}
{{/if}}
Run Code Online (Sandbox Code Playgroud)

而类别是一个数组,如果删除会话密钥,模板将继续显示类别的最后一个值.