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

Javascript 是否可以序列化/反序列化dojo小部件对象?,javascript,dojo,Javascript,Dojo,有人知道是否有可能将dojo widget(dijit)对象序列化/反序列化为可以在浏览器会话中持久化的字符串或某种表示形式吗 我的设想: 我有一个包含各种dijit的网页,我希望能够在新的浏览器会话中对其进行“快照”和恢复,以便将所有内容恢复到完全相同的状态。 为了做到这一点,我相信我需要序列化/恢复页面的DOM树以及dijit对象。我已经能够序列化DOM树,目前正在通过替换页面HTML节点的内容来恢复它。当页面的DOM被恢复时,所有的DIJIT都不起作用——它们被正确地呈现,但您不能单击其中

有人知道是否有可能将dojo widget(dijit)对象序列化/反序列化为可以在浏览器会话中持久化的字符串或某种表示形式吗

我的设想: 我有一个包含各种dijit的网页,我希望能够在新的浏览器会话中对其进行“快照”和恢复,以便将所有内容恢复到完全相同的状态。 为了做到这一点,我相信我需要序列化/恢复页面的DOM树以及dijit对象。我已经能够序列化DOM树,目前正在通过替换页面HTML节点的内容来恢复它。当页面的DOM被恢复时,所有的DIJIT都不起作用——它们被正确地呈现,但您不能单击其中任何一个。我认为这是因为dojo解析器在页面首次加载时已经运行过DOM,替换整个HTML DOM元素会破坏该页面的dijit注册表中的所有dijit。。这意味着dijit类必须重新实例化

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

比如: dijit.registry.forEach(函数(小部件){ //是否保存小部件对象,以便可以在新的浏览器实例中还原它? });


有没有人尝试过这个方法,或者知道不编写自定义序列化程序是否可行?

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

也就是说,可以独立于页面加载调用dojo解析器。你要找的是

dojo.parser.parse();
在重新填充innerHTML后运行该命令应该重新解析并重新创建DIJIT 有关完整参考信息,请参见本页:

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


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

如果收件人页面(dijit将被反序列化的地方)具有相同数量的小部件,最简单的解决方案是将所有内容封装在
dijit/form/form
中,并调用
valueJSON=form.get('value')
序列化,并
格式化。设置('value',valueJSON)
反序列化

对于dgrid和charts等表单中的小部件,它变得更加棘手。您必须采取特定于小部件的方法。例如:通过调用
grid.save()
,然后调用
JSON.stringify(grid.get('store'))
,可以轻松地序列化其值已更改的dgrid

如果反序列化页面可以有任意数量的小部件,我同意@treaint,您可以通过
widget.get('declaredClass')\\Returns TextBox等获取小部件的类型。


我们有一个类似的问题,但是我们用表单的get/set值很容易地解决了它!它非常巧妙,它迭代它的所有子对象,对每个子对象调用
child.get('value')
,并将其与它自己的值混合。

下面是我将执行建议的解决方案的过程:1)而不是序列化整个dijit对象,仅序列化恢复dijit状态所需的属性。(跳过函数和循环引用)2)重新填充DOM树时,运行dojo.parser.parse()重新实例化所有DIJIT。3) 反序列化dijit信息,并针对每个dijit-确定类型-基于类型,调用dijit上的方法以恢复其状态(只能通过方法调用修改dijit的状态)步骤2让我担心:当解析器重新解析页面时,它会修改每个dijit所附加的DOM元素的属性吗?(因为dijit被重新实例化为“新”状态)步骤3很难实现。我需要根据dijit类型和特定的属性名来确定需要调用哪些方法。例如,如果小部件是dijit.form.textbox,属性是{value:“First Name”},我需要获取这两条信息并确定调用dijit.form.textbox.set('displayedValue','First Name')dijit.registry.forEach(函数(w){console.log(dojo.toJson(w));});抛出一个“无法序列化DOM节点”异常即使这样做有效,您建议如何反序列化它?见:
var deserialisedValue = dojo.toJson(myObject);