我可以将Meteor会话变量重置为它吗';默认值是多少?

我可以将Meteor会话变量重置为它吗';默认值是多少?,meteor,Meteor,我想将Meteor会话变量重置为其默认值-可能吗 例如: 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的东西,它将执行以下

我想将Meteor会话变量重置为其默认值-可能吗

例如:

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
的东西,它将执行以下操作(在上述操作之后):


没有类似于
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);
    }
  },

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


我想出了这个密码:

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();
会话是
ReactiveDict
的一个实例,因此我所做的是通过继承常规
ReactiveDict
来定义我们自己的
MyReactiveDict
,添加我们想要的功能,最后将
MySession
声明为
MyReactiveDir
的一个实例

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

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

Session=new MyReactiveDict(Session.keys);
这是因为
ReactiveDict
构造函数可以从一组现有键开始


您需要将反应式dict添加到应用程序中,此代码才能正常工作。

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

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()

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

resetToDefault();