【问题标题】:p:selectOneMenu get just first value from list primefaces JSFp:selectOneMenu 从列表 primefaces JSF 中获取第一个值
【发布时间】:2013-11-10 13:30:35
【问题描述】:

我有 p:selectOneMenu,所有值都可以正确查看,但可以选择我列表中的第一个,例如,在我的列表中,我有电子邮件地址,我可以选择所有人,但邮件只发送到其中的第一个列表。我的 JSF 代码:


<p:dataTable value="#{additionalOrdersBean.additionalOrdersList}"
var="additionalOrders" rowIndexVar="lp" id="myTable" editable="true>
    <p:column>
        <p:selectOneMenu id="recipient"  value="#{additionalOrdersBean.mailTo}" converter="#{mailConverter}" required="true" requiredMessage="#{loc['fieldRequired']}">
            <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail1}" itemValue="#{mail.mail1}" />
            <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail2}" itemValue="#{mail.mail2}" />
            <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail3}" itemValue="#{mail.mail3}" />
        </p:selectOneMenu>
        <h:message for="recipient" style="color:red"/>
        <h:commandButton value="#{loc['send']}" action="#{additionalOrdersBean.sendProtocol()}" onclick="sendProtocolDialog.hide()"/>
    </p:column>
</p:dataTable>


我的豆子:

private String mail1;
private String mail2;
private String mail3;

public List<Building> getBuildingList2() {
    buildingList2 = getBldRepo().findByLocationId(lid);
    return buildingList2;
}



谁能知道如何解决它?我不会在选择的地址上发送电子邮件,而不仅仅是我列表中的第一个。谢谢

【问题讨论】:

  • 不确定您当前的问题,但我只能说您需要删除 getBuildingList2 中的业务逻辑,因为它被多次调用。请参阅stackoverflow.com/q/2090033/1065197。可能解决这个问题也可以解决您当前的问题。
  • 但是当我把它放在 p:dialog 中可以正常工作,只有在 p:dataTable 中不行。
  • 您是否阅读了链接并理解了问题所在?

标签: jsf primefaces selectonemenu


【解决方案1】:

您似乎希望在按下行中的命令按钮时仅提交当前行。这是不真实的。命令按钮提交整个表单。在您的特定情况下,表单正在包装整个表格,因此提交了每一行中的下拉列表。

但是,所有这些下拉列表的 value 属性都绑定到一个相同的 bean 属性,而不是当前迭代的行。

结果是,对于每一行,当前选择的值都设置在 bean 属性上,因此每次都会覆盖前一行设置的值,直到最后一行的选择值结束。

您在这里基本上是一个设计错误和对基本 HTML 表单如何工作的根本误解。您基本上需要将表单移动到表格单元格内,以便仅将同一单元格中包含的数据提交给服务器。

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

如果这在技术上不是设计选项(例如,因为您在同一行的另一个单元格中输入了输入,或者在表格之外也需要发送),那么您需要绑定 @987654324 @ 属性改为当前迭代的行,并将该行准确地传递给命令按钮的操作方法:

<p:dataTable value="#{additionalOrdersBean.additionalOrdersList}" var="additionalOrders" ...>
    <p:column>
        <p:selectOneMenu value="#{additionalOrders.mailTo}" ...>
            ...
        </p:selectOneMenu>
        ...
        <h:commandButton value="#{loc['send']}" action="#{additionalOrdersBean.sendProtocol(additionalOrders)}" ... />
    </p:column>
</p:dataTable>

顺便说一句,var 名称中有复数形式不是自我记录的,而且相当混乱。你不想叫它additionalOrder吗?还是代表一个附加订单的 javabean/entity 类真的被命名为AdditionalOrders


与具体问题无关:在 getter 方法中执行业务逻辑正在扼杀您的应用程序。只是不要那样做。另见Why JSF calls getters multiple times

【讨论】:

  • 谢谢,这很有帮助!:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2012-07-30
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多