我可以将Meteor Session变量重置为它的默认值吗?

时间:2014-09-02 16:36:15

标签: meteor

我想将Meteor Session变量重置为它的默认值 - 这可能吗?

示例:

Session.setDefault 'foo', 'bar'
Session.get 'foo' # => 'bar'
Session.set 'foo', 'boing'
Session.get 'foo' # => 'boing'
delete Session.keys['foo']
Session.get 'foo' # => undefined

但是我想要resetToDefault这样的东西(在上面之后):

Session.get 'foo' # => undefined
Session.resetToDefault()
Session.get 'foo' # => 'bar'

3 个答案:

答案 0 :(得分:2)

没有像resetToDefault这样的功能。

Session.setDefault的实现方式如下:

setDefault: function (key, value) {
    var self = this;
    // for now, explicitly check for undefined, since there is no
    // ReactiveDict.clear().  Later we might have a ReactiveDict.clear(), in which case
    // we should check if it has the key.
    if (self.keys[key] === undefined) {
      self.set(key, value);
    }
  },

Source

您可以做的是创建具有所有默认值的js对象,然后一旦您想要重置,只需访问该对象即可获得正确的密钥值并使用Session.set(key, value)

defaultsObject = {
  A : 1,
  B : 2
}

答案 1 :(得分:2)

我想出了这段代码:

function MyReactiveDict(keys){
    ReactiveDict.call(this,keys);
    this.defaults={};
}
MyReactiveDict.prototype=Object.create(ReactiveDict.prototype);

_.extend(MyReactiveDict.prototype,{
    setDefault:function(key,value){
        ReactiveDict.prototype.setDefault.call(this,key,value);
        this.defaults[key]=value;
    },
    resetToDefault:function(key){
        this.set(key,this.defaults[key]);
    }
});

MySession=new MyReactiveDict();

Session是ReactiveDict的一个实例,所以我做的是通过继承常规MyReactiveDict来定义我们自己的ReactiveDict,添加我们想要的功能,最后声明MySession }作为MyReactiveDir的实例。

MySession会通过您在答案中描述的测试。

我认为您甚至可以通过使用以下代码保留已定义的密钥来安全地覆盖应用中的Session

Session=new MyReactiveDict(Session.keys);

那是因为ReactiveDict构造函数可以从一系列现有的键开始。

您需要meteor add reactive-dict到您的应用程序才能使用此代码。

答案 2 :(得分:0)

这是我的解决方案:只需创建一个设置所有会话变量的函数。然后你称之为这个功能。

resetToDefault = function() {
    Session.set('expertMode', false);
    Session.set('displayNavigation', false);
    Session.set('displaySidebar', true);
    Session.set('currentEvent', null);
    Session.set('activeLayers', []);
};

resetToDefault();

如果确保您的函数是在client / lib下定义的,那么它将在其他所有函数之前调用,您也可以使用它而不是Session.setDefault()。

之后,您可以从客户端内的任何位置调用resetToDefault()。