0

所以,我有一个会话范围的 bean,它有 2 个字符串值列表。此 bean 称为 AgreementBean.java。我在一个名为 agreementDetail.xhtml 的页面中显示这些列表,如下所示

<h:dataTable id="servers" value="#{agreement.licenseServerNames}" var="licenseServerName">
                        <h:column>
                            <h:inputText value="#{licenseServerName}"/>
                        </h:column>
                    </h:dataTable>
                    Computer IDs<br/>
                    <h:dataTable id="idNames" value="#{agreement.computerIdNames}" var="computerIdName">    
                        <h:column>
                            <h:inputText value="#{computerIdName}"/>
                        </h:column>
                    </h:dataTable>  

如您所见,我希望用户输入这些值。当客户单击“保存按钮”时,我需要进行 Ajax 调用以更新这些值。这是按钮的jsf代码。

<script type="text/javascript">
                        function showAlert(data){                          
                                 alert("SAVED!");   
                        }
                    </script>
                    <h:commandButton value="Save" immediate="true" type="submit" action="#{agreement.save}">
                        <f:ajax onevent="showAlert"/>
                    </h:commandButton><br/><br/>    

“Save” bean 方法现在什么都不做,除了记录存储在两个列表中的值。单击按钮时,现在正在发生两件事。如果客户更改了 inputFields 上的值,则 bean 的列表值设置为 null。如果客户没有更改任何内容,则保留 bean 的原始值。

我怎样才能解决这个问题?谢谢!

4

1 回答 1

6

您的命令按钮有 2 个问题:

<h:commandButton value="Save" immediate="true" type="submit" action="#{agreement.save}">
    <f:ajax onevent="showAlert"/>
</h:commandButton>
  1. immediate="true"导致仅处理immediate="true"设置的输入元素。但是,您的输入没有设置此属性。

  2. <f:ajax execute>默认为@this,导致在表单提交期间处理命令按钮本身。因此,您的输入将在处理过程中被跳过。

摆脱放错位置的属性并告诉<f:ajax>执行整个表单。

<h:commandButton value="Save" type="submit" action="#{agreement.save}">
    <f:ajax execute="@form" onevent="showAlert"/>
</h:commandButton>

也可以看看:


然后,您的数据模型存在潜在问题。您似乎正在向List<String>数据表提供 a 而不是 a List<SomeBean>。是不可变的String,并且没有值的设置器。A<h:inputText value="#{string}">永远不会工作。对于第一个表,您确实需要一个LicenseServer具有private String name属性的 bean。然后,您可以按如下方式使用它:

<h:dataTable value="#{agreement.licenseServers}" var="licenseServer">
    <h:column>
        <h:inputText value="#{licenseServer.name}"/>

也可以看看:


与具体问题无关,您是否知道onevent被调用了 3 次?出于这个目的,您可能想检查 ajax 事件状态是否等于"success".

也可以看看:

于 2013-08-12T19:34:30.717 回答