0

我试图保留 Zen Page 属性的值,这是一个复杂类型的数组,但我没有成功。当我在这个数组中设置一个对象并且我这样做时的方法完成时,数组被清除。例如,当我将属性作为 %String 的数组时,同样的情况不会发生。

这是我的 Zen Page 的代码:

Class so1.Page Extends %ZEN.Component.page
{

Property ValueArray As array Of so1.ComplexType;

XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
<page xmlns="http://www.intersystems.com/zen" title="">
<button caption="Fill Array" onclick="zenPage.FillArray()"/>
<button caption="Show Array" onclick="zenPage.ShowArray()"/>
</page>
}

Method FillArray() As %Status [ ZenMethod ]
{
    Set tComplexType = ##class(so1.ComplexType).%New()
    Set tComplexType.Name = $Case($Random(2)+1,1:"Value1",2:"Value2",3:"Value3")
    Set tComplexType.Value = ($Random(2)+1)*10
    Set tKey = ..ValueArray.Count()+1
    Set tSC = ..ValueArray.SetAt(tComplexType,tKey)
    &js<alert(#(..ValueArray.Count())#);>
    Quit tSC
}

Method ShowArray() As %Status [ ZenMethod ]
{
    &js<alert(#(..ValueArray.Count())#);>
    Quit $System.Status.OK()
}

}

这是我的复杂类型类的代码:

Class so1.ComplexType Extends %RegisteredObject
{

Property Name As %String;

Property Value As %String;

}

测试 Zen 页面,当我单击“填充数组”按钮时,我在 ValueArray 属性的数组中设置了一个对象。然后我显示数组元素编号。当我单击“显示数组”按钮时,我注意到 ValueArray 属性的数组不再具有该对象。

有没有办法将对象保留在 ValueArray 属性的数组中?或者保留值的独特方法是将它们保存在持久对象中?

提前致谢。

4

1 回答 1

1

问题是 Zen 不知道如何序列化您的复杂对象,因此当您在客户端和服务器之间移动时,它无法表示内容。

虽然您可以通过扩展 %ZEN.Component.object 使对象可序列化,但我建议您在页面中使用 %ZEN.Auxiliary.jsonProvider 组件来管理服务器和客户端之间的对象,这在很大程度上是因为它允许您在客户端和服务器之间保持一致的对象模型,并让您更加清楚何时进行服务器调用,以及应该在何处操作数据。在上面的示例中,从客户端调用ShowArray()和调用FillArray()是昂贵的,因为需要将整个页面序列化回服务器。它还可能使确定数据何时在服务器上被操作以及何时在客户端上被操作以及应该执行更新的时间变得棘手。

我的强烈偏好是使用 Javascript 来操作客户端上的对象,然后在需要时执行整个结构的保存/更新。

于 2014-04-14T14:29:15.833 回答