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>
就这些了。
我试图打印在 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>
就这些了。