p:remoteCommand 内部迭代组件如 p:dataTable 仅适用于最后一行

p:remoteCommand inside iterating component like p:dataTable only works for last row

我试图打印在 inputText 中输入的值,但它只显示 0 除了最后一行它显示正确的值! 这是一个最小代码(我没有包括所有字段和 getters/setters)

@ManagedBean(name="medicament")
@ViewScoped
public class MedicamentBean {
  private List<Medicament> medicaments;
  private String libelle;
  private int qte_vente;

  public void test() {
    System.out.println(this.qte_vente);
}
}

html:

<h:form>
<p:dataTable value ="#{medicament.medicaments}" var ="m">
   <p:column headerText="libelle">      
      <h:outputText value = "#{m.libelle}"/>
   </p:column>
<p:column headerText="qte">
    <h:inputText value ="#{medicament.qte_vente}" onkeyup="myCommand();"/>
    <p:remoteCommand name="myCommand" actionListener="#{medicament.test()}"  style="display: none;" 
 />
   </p:column>

</p:dataTable>
</h:form>

在网络浏览器中打开网页。右键单击并选择 查看页面源代码 。仔细查看您在那里看到的生成的 HTML 输出。例如,当您有 10 table 行时p:datatable,它应该看起来像这样

<table>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
    <tr><td><script>function myCommand() { /* ... */ }</script></td></tr>
</table>

(当你使用像 p:datagrid 甚至像 ui:repeat 这样的不同的迭代组件时,它看起来不同,但通用的 'repeating' 是相同的)

猜猜当你在 JavaScript 中执行 myCommand() 时调用了哪一个 ...

对,那是行不通的。

它只适用于<p:remoteCommand> 外部 <p:dataTable>pass a parameter,这是一个通用的解决方案各种迭代组件。

但在你的情况下,你实际上把事情复杂化了。只需使用 <p:ajax> 即可。

<h:inputText ...>
    <p:ajax event="keyup" listener="#{medicament.test()}" />
</h:inputText>

就这些了。