我正在尝试将输入框绑定到多值字段中的条目, 像这样:
<xp:repeat id="repeat6" rows="30" var="rows" indexVar="ind">
<xp:this.value><![CDATA[#{javascript:order.getItemValue("ArtNo")}]]></xp:this.value>
<xp:inputText id="inputText9" style="width:20px" value="#{order.ArtQuantity[ind]}">
</xp:repeat>
当ArtNo字段中有两个值时,它可以工作,但不存在单个值时。我的猜测是,当只有一个条目时它不再是一个数组,因为我得到了这个错误:
从java.lang.Double类型的bean获取属性“0”时出错 - PropertyNotFoundException错误,找不到组件:
如何修复我的代码以便EL代码顺序.ArtQuantity [ind]始终有效,即始终是一个数组?
感谢
托马斯
答案 0 :(得分:2)
您可以使用绑定到#{order.ArtQuantity}
的简单文本更改重复。渲染属性可以根据isArray检查更改这两个属性。
<强>更新强>
正如Knut评论的那样,shilem的解决方案无效。我的结论是:
size()
从仅包含一个值的字段返回的标量值获得getItemValue
。简单的更改可使其有效:getComponent("repeat6").getRowCount() == 1
和多个值getComponent("repeat6").getRowCount() > 1
。丑陋,我知道。[n]
元素的提交值是通过绑定order.artQuantity
的第一部分检索的一些临时Vector完成的。文档的字段未更新。似乎是一个错误。可能的解决方法是创建专用控件,它将处理内部存储(支持bean,范围变量,dataContext
)的所有编辑,并使用列表中所有元素的组合值更新文档一次。
答案 1 :(得分:1)
您目前使用的方法告诉我您没有bean管理,更不用说任何更好的DAO / DTO模式,除了XPage提供的开箱即用。
这是一个不太优雅的解决方案(人们可以期待什么?SSJS是不优雅的缩影):
<xp:repeat value="#{order.artNo}" var="artNo" indexVar="n">
<xp:inputText value="#{order.artQuantity}"
rendered="#{javascript: order.getItemValue('artQuantity').size() === 1}">
<xp:this.converter>
<xp:convertNumber />
</xp:this.converter>
</xp:inputText>
<xp:inputText value="#{order.artQuantity[n]}"
rendered="#{javascript: order.getItemValue('artQuantity').size() > 1}">
<xp:this.converter>
<xp:convertNumber type="number" />
</xp:this.converter>
</xp:inputText>
</xp:repeat>
基本上,2个输入控件中的一个基于artQuantity
中存在的值的数量进行渲染。这样,对任何artQuantity
字段实例值的任何更新都将自动保存回文档项。这是最快捷,最脏的方式。