Xpages:在CSJS中获取sessionScope数组

时间:2016-12-22 12:28:41

标签: xpages

我正在使用一个使用Xpages和KendoUI的应用程序。在一个特定的页面中,我有一个带有按钮的工具栏,其中包含"添加记录"。该按钮打开一个窗口,用户将从一段数据中选择一个,这将创建一个新记录。

数据列表是员工姓名,我必须计算它们。我在beforePageLoad中的sessionScope [可能是viewScope]数组中这样做,如下所示:

<xp:this.beforePageLoad>
<![CDATA[#{javascript:viewScope.myArray = []; 
viewScope.myArray.push("1st Val");
viewScope.myArray.push("2nd Val"); 
viewScope.myArray.push("3rd Val");}]]>
</xp:this.beforePageLoad>

下拉列表需要采用以下格式的数据:

  var data = [
                { text: "Black", value: "1" },
                { text: "Orange", value: "2" },
                { text: "Grey", value: "3" }
                ];

对于我的生活,我无法将数据转换为该格式。它对我来说看起来像一个javascript对象。

如何将viewScope中的数组转换为我需要的格式?

var o = {};
o = "#{javascript:viewScope.get('myArray');";

2 个答案:

答案 0 :(得分:3)

添加到任何范围的所有SSJS Array对象都将转换为 java.util.Vector how to update a value in array scoped variable?),这些对象无法使用标准toJson函数进行字符串化。这可以通过创建一个中间对象来存储数组来避免:

viewScope.myData={myArray:[]};
viewScope.myData.myArray.push( { text : 'Mark' , value : '1' } );
viewScope.myData.myArray.push( { text : 'Bryan' , value : '2' } );

另外,我怀疑你的代码行在没有任何显式JSON转换的情况下返回正确的数据。我会把它写成:

var myArray = #{javascript:return toJson(viewScope.myData.myArray);};

答案 1 :(得分:1)

当您将客户端js变量设置为o时,它是一个字符串,因为该值介于“”之间。

因此,只需删除双引号即可将其作为对象。

o=#{javascript:viewScope.get('myArray')};

但请注意,如果viewscope值不是有效的客户端JS对象,则可能会出现js客户端错误!

您也可以像在示例中一样将变量o设置为字符串,并使用eval clientside方法将字符串计算为对象。

o=eval("#{javascript:viewScope.get('myArray')}");

P.S。在您的示例中,当您设置“o”变量时,在SSJS代码的末尾有一个}缺失...; - )