重复控制绑定到重复集合中返回字符串的数组
问题描述:
我试图通过获取NotesViewEntryCollection,然后循环这个集合来构建一个数组,其中的每个值在一个重复控制中显示一个视图的子集数组包含与条目中列值对应的数组。 <xp:text escape="true" id="computedField1" value="#{javascript:rowData[rowIndex][0]}"></xp:text>
重复控制绑定到重复集合中返回字符串的数组
的错误是::
未知的成员 '0' 在Java类 'java.lang.String中'
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:repeat id="repeat1" rows="30" var="rowData" indexVar="rowIndex"> <xp:this.value><![CDATA[#{javascript: var view:NotesView = database.getView("CatalogEntries"); var entryColl:NotesViewEntryCollection = view.getAllEntriesByKey(compositeData.catalog, true); if (entryColl.getCount() == 0) return ["empty"]; var entries = []; var columnVals = []; var entry:NotesViewEntry = entryColl.getFirstEntry(); do { columnVals = []; columnVals.push(entry.getColumnValues()[0]); columnVals.push(entry.getColumnValues()[1]); columnVals.push(entry.getColumnValues()[2]); columnVals.push(entry.getColumnValues()[3]); columnVals.push(entry.getColumnValues()[4]); columnVals.push(entry.getColumnValues()[5]); entries.push(columnVals); entry = entryColl.getNextEntry(entry); } while(!(entry == null)) return entries;}]]></xp:this.value> <xp:text escape="true" id="computedField1" value="#{javascript:rowData[rowIndex][0]}"></xp:text> </xp:repeat> </xp:view>
但我在这条线得到一个错误
有关如何解决此问题的任何想法?
答
我觉得这可以 - 不应该! - 简化。基本思路是,您可以将Domino视图数据源或整个对象作为填充到repeat
对象中。这样你最终会得到代表单个NotesViewEntry
对象的rowData
。您的computedField
值可以直接引用条目的columnValues
Vector中的任何元素。这样,您甚至不需要费心去回收任何对象:
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoView var="myView" viewName="CatalogEntries" keys=compositeData.catalog keysExactMatch="true">
</xp:dominoView>
</xp:this.data>
<xp:repeat id="repeat1" rows="30" var="rowData" value="#{myView}">
<xp:panel id="pnInner">
<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:
if(rowData){
return rowData.getColumnValues()[0].toString();
}else{
return "empty";
}}]]>
</xp:this.value>
</xp:text>
</xp:panel>
</xp:repeat>
</xp:view>
过滤视图数据是在数据源级完成的。
答
在您的push方法中,您不传入数组索引。
columnVals.push(entry.getColumnValues()[0]);
应该
columnVals.push(entry.getColumnValues());
霍华德
+0
而且,请务必在您循环浏览Notes视图时回收利用! – Howard
我完全同意Lothar。具有'keys'属性集的dominoView几乎可以做你正在做的事情,但是使用ViewNavigator并限制条目数量是为了获得更好的性能而从运行时收集的,以及回收视图条目和视图条目值(可以包括日期/时间,在回收ViewEntry时不会自动回收)。只有在绝对需要时手动迭代ViewEntries。 'getColumnValues()'必须提取所有列值,所以即使只需要一列,实际上也必须全部得到它们,所以不要在那里保存。 –
完全同意这种方法。非常感谢你! – jpishko