by veCol = vw.getAllEntriesByKey(key,false)其中key是来自'form'上控件的值。如果veCol中的计数为零,则返回搜索失败的消息,如果计数为1(一)我设置了一些值并将页面重定向到输入页面,但是,如果计数大于我想要的将veCol显示为重复控件。我想到将viewScope变量设置为veCol,但我看到被告知不会在Scope变量中存储Notes对象,因为它们没有被序列化。 所以我的问题是“有没有办法将我的veCol传递给同一个自定义控件上的重复控件?”实际上控制是一个对话,但这无关紧要。
在另一个例子中,我采用了集合并将其转换为viewScope变量中的UNID数组,然后将repeat绑定到变量。这意味着我必须使用可行的UNID再次获取每个文档,但是veCol已经包含了我需要的所有内容,只是能够通过它会更有效率。所以我知道我可以让它发挥作用但是有相当大的开销。
我的按钮中的代码非常简单我执行var veCol:NotesViewEntryCollection = vw.getAllEntriesByKey(key,false);
在包含按钮的同一对话框中我希望使用返回的值作为veCol重复。
任何帮助表示感谢。
答案 0 :(得分:1)
您可以创建自己的值绑定并覆盖重复的现有值:
<xp:button
value="Label"
id="button1">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="partial"
refreshId="repeat1">
<xp:this.action>
<![CDATA[#{javascript:
var valueExpr = "#{javascript:vw.getAllEntriesByKey(key, false);}";
var value:javax.faces.el.ValueBinding = facesContext.getApplication().createValueBinding(valueExpr);
var veCol:NotesViewEntryCollection = value.getValue( facesContext );
if( veCol.getCount() > 0 ){
var cmpRepeat:com.ibm.xsp.component.xp.XspDataIterator = getComponent('repeat1');
cmpRepeat.setValueBinding( "value", value );
}else{
// do redirect
}
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
或者只是在按钮中定义一个SSJS变量,并测试该变量是否存在:
<xp:repeat
id="repeat1"
rows="30"
var="doc">
<xp:this.value>
<![CDATA[#{javascript:
if( typeof( veCol ) != "undefined" ){
return veCol;
}
}]]>
</xp:this.value>
<xp:label
value="#{javascript:if( doc != null ) doc.getUniversalID()}"
id="label1">
</xp:label>
</xp:repeat>
答案 1 :(得分:0)
我很想看到一些代码甚至是流程图。
首先,您可以将Viewentrycollection传递给重复控件。我实际上已经问过这个了。 :) How do you pass a NotesDocument / NotesViewEntry Collection into a Custom Control via custom property?
我同意您不想尝试将您的收藏存储在viewScope本身中。在Java世界中,我认为这是相对简单的,但让我们保持非Java,因为这就是你所要求的。
检查这个问题: How to pass variable parameters to an XPages SSJS function?
而不是你的集合的UNIDS的ArrayList,你可以为每个文档创建一个javascript对象,并将字段名称和值放在那里...它有点像JSON在某种程度上......至少我是怎么想的。现在它是“安全的”所以如果你不想将多米诺骨牌对象传递给重复控件本身,你可以把它放在范围内或者返回那个或者其他什么......