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

标签 javascript meteor

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

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

我无法再获取设置它,因为它是一个普通对象。
有人知道它的意义吗?

PS:另一个 ReactiveVar 中的 ReactiveVar 效果很好

最佳答案

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

考虑以下代码:

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

控制台将输出:

Object { }

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

如果您想将来自 ReactiveVar 的无功值存储到 Session 中,则必须运行 Tracker计算来做到这一点:

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

如果您想通过方法或定义的原型(prototype)以 react 方式存储对象,请使用 ReactiveVar

关于javascript - 为什么在 Session 中存储 ReactiveVar 会将其转换为普通对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33335808/

相关文章:

css - 尝试将 anchor 标记链接到 meteor js 中的 div id

meteor - Metoerjs 裸域重定向

javascript - 将分页移到数据表之外

javascript - 如何在 Handlebars 中设置 (!)?

javascript - javascript中如何将多个对象转换为键值对的Array[]

javascript - 如何从菜单预加载 html 链接并使用 javascript 隐藏/显示内容?

javascript - 有没有办法在 webview 中拦截 javascript 触发的 URL?

meteor - 更改路线时防止 Meteor/Iron 路由器重新加载

html - 如何使用 Handlebars 为 Meteor.js 中的每个命令填充 Bootstrap 网格系统?

mongodb - Meteor 应用程序 — 重置已部署应用程序的数据库