我正在使用一个使用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');";
答案 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代码的末尾有一个}缺失...; - )