是否可以序列化/反序列化dojo小部件对象?

时间:2011-02-24 19:50:41

标签: javascript dojo

是否有人知道是否可以将dojo小部件(dijit)对象序列化/反序列化为字符串或可以在浏览器会话中保留的某种表示形式?

我的情景: 我有一个包含各种dijits的网页,我希望能够在新的浏览器会话中拍摄“快照”并恢复,以便所有内容都恢复到完全相同的状态。 为了做到这一点,我相信我需要序列化/恢复页面的DOM树以及dijit对象。我已经能够序列化DOM树,并且我正在通过替换页面的HTML节点的内容来恢复它。当页面的DOM被恢复时,dijits都不起作用 - 它们被正确渲染但你无法点击它们中的任何一个。我相信这是因为dojo解析器在页面首次加载时已经运行了DOM,并且替换整个HTML DOM元素会破坏该页面的dijit注册表中的所有dijit ..这意味着dijit类必须重新启动实例

理想情况下,我希望能够做的是当我拍摄“快照”时,将页面的dijit.registry中包含的每个dijit对象序列化为文件,并且当会话恢复时,重新构造那些dijit对象并将它们添加回dijit注册表。

像: dijit.registry.forEach(函数(插件){     //保存小部件对象,以便可以在新的浏览器实例中恢复它? });

有没有人试过这个或知道是否可以不编写自定义序列化程序?

4 个答案:

答案 0 :(得分:1)

我不确定我是否同意您使用的技术。更好的方案是简单地序列化每个dijit的数据状态。我知道这将是更多的工作,但你正在努力保持数据的状态,带来用户界面的UI似乎保留了不必要的信息。

话虽如此,可以独立于页面加载调用dojo解析器。您正在寻找的是

dojo.parser.parse();

在重新填充innerHTML之后运行它应该重新解析并重新创建dijits 请参阅此页面以获取完整参考:http://docs.dojocampus.org/dojo/parser

答案 1 :(得分:0)

任何javascript对象(包括dojo小部件)都可以使用dojo.toJson()序列化为JSON,例如:

var deserialisedValue = dojo.toJson(myObject);

答案 2 :(得分:0)

我的猜测是,我们可以序列化和反序列化dojo小部件,但是也应该序列化和反序列化构建这些小部件的商店(以及商店的类型)。 这可能涉及使用eval语句,这被认为是邪恶的。此外,我认为事件处理程序,这些小部件订阅的主题可能无法序列化和反序列化。

答案 3 :(得分:0)

如果收件人页面(dijits将被反序列化)具有相同数量的小部件,最简单的解决方案是将所有内容包装在dijit/form/Form内并调用valueJSON = form.get('value')以进行序列化和{{ 1}}反序列化。

对于像dgrid和图表这样的窗体中的小部件,它会变得更加棘手。您必须采用特定于小部件的方法。例如:通过调用form.set('value', valueJSON)然后调用grid.save(),您可以轻松地序列化其值已更改的dgrid。

反序列化页面可以包含任意数量的小部件,我同意@treaint您可以通过JSON.stringify (grid.get('store'))获取小部件的类型

我们遇到了类似的问题,但我们使用表单的get / set值很容易解决了这个问题!它非常巧妙,它遍历所有孩子,在每一个孩子身上调用widget.get('declaredClass') \\Returns TextBox etc.并将其与自己的价值混合。