为什么在Session中存储ReactiveVar会将其转换为普通对象?

时间:2015-10-25 22:26:22

标签: javascript meteor

如果我在ReactiveVar中存储Session然后阅读,我会看到我的ReactiveVar被转换为对象。

var v = new ReactiveVar(4)
Session.set("v", v)
Session.get("v") //Object {curValue: 4, dep: Object}

我不能再getset了,因为它是一个普通的物体。
有人知道它的意义吗?

PS:ReactiveVar在另一个ReactiveVar内部效果很好

1 个答案:

答案 0 :(得分:1)

Sessionglobal named ReactiveDict 所有被动词典都有一个非常有趣的功能:他们stringify您的数据存储 他们这样做是为了将其存储在热代码推送中。例如。

请考虑以下代码:

var dict = new ReactiveDict()
dict.set('foo', { func : function() {} })
console.log(dict.get('foo'))

控制台将输出:

  

Object { }

这是因为EJSON stringification(由Meteor定义)基于JSON stringification,它删除了对象方法和原型以严格保存数据。

如果您要将来自ReactiveVar的无效值存储到Session,则必须运行Tracker计算才能执行此操作:

Tracer.autorun(
  () => Session.set('foo', foo.get()) 
)

如果您想要使用方法或定义的原型反应性地存储对象,请使用ReactiveVar