如何使用EL将字段绑定到重复的数据源?

时间:2017-09-05 07:50:13

标签: java xpages el

我正在尝试将输入框绑定到多值字段中的条目, 像这样:

<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]始终有效,即始终是一个数组?

感谢

托马斯

2 个答案:

答案 0 :(得分:2)

您可以使用绑定到#{order.ArtQuantity}的简单文本更改重复。渲染属性可以根据isArray检查更改这两个属性。

<强>更新

正如Knut评论的那样,shilem的解决方案无效。我的结论是:

  • 多值检查不起作用 - 您只能通过size()从仅包含一个值的字段返回的标量值获得getItemValue。简单的更改可使其有效:getComponent("repeat6").getRowCount() == 1和多个值getComponent("repeat6").getRowCount() > 1。丑陋,我知道。
  • 绑定到Vector元素不起作用。它应该(像这里:https://stackoverflow.com/a/6743138/206265)。它失败了数据源 - 似乎应用[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字段实例值的任何更新都将自动保存回文档项。这是最快捷,最脏的方式。

相关问题