我已经构建了一个PrimeFaces treeTable来包含(在顶层)人们订购的产品的详细信息。第二级显示订购该产品的个人成员。
我已经使用了渲染属性隐藏了第二级的一些列,所以最终看起来像这样(成员名称缩进)。
我在'Allocation'列的h:inputText控件上放了一个valueChangeListener。调用valueChangeListener方法中的代码,它计算出在订单数据库中要更新的行,然后使用用户输入的分配值更新该行。它有效,所以我对侦听器方法代码的作用没有任何问题。
这是问题...当我展开产品行时,我可能有几行带有分配输入框。 valueChangeListener只在我更新的第一行被调用。在上面的图片中,我先输入103然后输入101和102.对于第二个产品,我输入202然后输入201.数据库中只保存了103和202。我已经测试了模式,似乎只是为第一个为特定产品更新的分配调用了valueChangeListener。我可以继续扩展另一个产品行,和以前一样,我有机会更新第二个产品的分配。
我知道是否正在调用valueChangeListener方法,因为在输入方法之前,我会在调用任何其他代码之前将日志记录写入我的数据库。在上面的示例中,我有分配103和202的日志记录。
如果我输入一行的分配,然后收缩并展开产品,然后输入另一行的分配等,那么它可以工作。当然,我不能指望用户这样做;我只是提到它,因为它可能提供一个可能出错的线索。
这就是在treeTable中定义Allocation列的方法:
<p:column headerText="Supplier Qty" style="background-color:#{vAllocationRecord.rowtype=='Product' ? '#fafafa' : (vAllocationRecord.rowtype=='OrderLine' ? '#fff' : '')};text-align:left;">
<h:inputText id="supplierqty_input" value="#{vAllocationRecord.supplierqty}"
rendered="#{(vAllocationRecord.rowtype eq 'Product') and (loginBean.hasRole('Ordering'))}"
size="7" valueChangeListener="#{orderFormBean.handleSupplierQtyChange}"
disabled="#{vAllocationRecord.supplier eq 'Stock'}">
<p:ajax />
<f:converter converterId="bigDecimalPlainDisplay" />
</h:inputText>
<p:keyFilter for="supplierqty_input" mask="pnum" />
<h:outputText id="supplierqty_output" value="#{vAllocationRecord.supplierqty}"
rendered="#{!(loginBean.hasRole('Ordering'))}" >
<f:converter converterId="bigDecimalPlainDisplay" />
</h:outputText>
</p:column>