【问题标题】:How do I delete or remove Session variables?如何删除或移除 Session 变量?
【发布时间】:2012-05-31 09:41:33
【问题描述】:

Meteor 有一个 Session,它在客户端上提供一个全局对象,您可以使用它来存储任意一组键值对。使用它来存储列表中当前选定的项目等内容。

支持Session.set、Session.get和Session.equals。

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

【问题讨论】:

    标签: meteor


    【解决方案1】:

    [注意:此答案适用于 Meteor 0.6.6.2 到至少 1.1.0.2]

    [编辑:更新还解释了如何在不破坏反应性的情况下执行此操作。感谢@DeanRadcliffe、@AdnanY、@TomWijsman 和@MikeGraf!]

    数据存储在Session.keys里面,它只是一个对象,所以你可以手动删除key:

    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()先将键设置为未定义,然后手动删除它们。像这样:

    // 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.fooSession.keyValueDeps.foo 中仍然会有一些残留物,但这不应该成为阻碍。

    【讨论】:

    • 不建议躲在Session的掩护下直接操作按键。但是,您可以将它用于每个键名:Object.keys(Session.keys).forEach(function(key){ Session.set(key, undefined); })
    • @DeanRadcliffe,非常感谢您的贡献。我实际上在关注this anwser(我现在编辑了),但找不到反应性消失的原因。没有你的贡献,我会流浪很久。你摇滚。非常感谢!
    【解决方案2】:

    Session.set('name', undefined)Session.set('name', null) 应该可以工作。

    【讨论】:

    • 这实际上是删除它还是只是将值设置为 undefined 或 null?
    • @SteeveCannon:不,它实际上并没有删除它;但它会使Session.get('name') 返回未定义或空值。我认为当 Session.get('name') 尚未使用时,它也会返回 undefined 。我认为不需要实际删除变量,至少在反应式上下文中不需要。对于非反应性存储,您很可能应该使用类似放大(持久)或只是一些变量(临时)的东西。
    • 如果您将其设置为未定义,它会起作用。我还没有测试将其设置为空。会话键/值对不会立即消失,但稍后会消失。一定和gc有关。谢谢
    • 这个对话在 IRC 上继续进行。总结:GC 删除时间取决于浏览器,也就是说,如果 GC 正在运行。 Session.delete() 应该被实现...
    • 此解决方案因 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 版本)
    【解决方案3】:

    使用 delete Session.keys['foo'] 的缺点是如果会话密钥包含一个数组,您的模板将不会热重载。例如,如果你正在做

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

    在你的模板中

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

    而categories是一个数组,如果你删除session key,你的模板会继续显示category的最后一个值。

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2018-06-02
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多