1

我有一个带有 inputText 的屏幕,旁边有一个 (+) 按钮,当用户按下该按钮时,表单应在其旁边(或下方,等等)添加另一个额外的 inputText

这是代码:

<table>
  <tr>
    <td>
      <p:inputText value="#{controller.x}" />
      <img src="../images/ico_plus.png" />
    </td>
  </tr>
</table>

在 Controller.java 中:

private String x;

public String getX(){return x}
public void setX(String val){x = val}

我需要用多个字段填充页面,并且控制器需要获取所有字段值

4

1 回答 1

3

这个问题被回答了不止一次,基本上你需要为 bean 中的所有字段保留一个,然后用你的按钮List删除或添加它。List请注意,这很重要,ViewScoped否则SessionScopedList将在每次操作时重置。

看法 :

<h:form>
    <h:dataTable id="tblFields" value="#{bean.fields}" var="field">
        <h:column>
            <h:inputText value="#{field.value}" />
        </h:column>

        <h:column>
            <h:commandButton value="Remove">
                <f:ajax listener="#{bean.onButtonRemoveFieldClick(field)}" immediate="true" render="@form" /> 
            </h:commandButton>
        </h:column>
    </h:dataTable>

    <h:commandButton value="Add">
        <f:ajax listener="#{bean.onButtonAddFieldClick}" execute="@form" render="tblFields" /> 
    </h:commandButton>
</h:form>

助手类:

public class Field implements Serializable
{
    private String m_sName;

    public void setName(String p_sName)
    {
        m_sName = p_sName;
    }

    public String getName()
    {
        return m_sName;
    }
}

豆 :

@ManagedBean
@ViewScoped
public class Bean implements Serializable
{
    private List<Field> m_lFields;

    public Bean()
    {
        m_lFields = new ArrayList();

        m_lFields.add(new Field());
    }

    public void setFields(List<Field> p_lFields)
    {
        m_lFields = p_lFields;
    }

    public List<Field> getFields()
    {
        return m_lFields;
    }

    public void onButtonRemoveFieldClick(final Field p_oField)
    {
        m_lFields.remove(p_oField);
    }

    public void onButtonAddFieldClick(AjaxBehaviorEvent p_oEvent)
    {
        m_lFields.add(new Field());
    }
}
于 2013-05-26T18:46:39.247 回答