primefaces commandButton未在ui:repeat

时间:2018-11-08 17:28:01

标签: jsf primefaces

我在视图作用域bean中有列表。 #{repeatController.add}一个新对象到列表。它将同时调用h:commandButton和p:commandButton。

我的问题是,当我有新行时,在“ repeatName”字段中键入一些内容,然后按h:commandButton或p:commandButton,它们的工作方式会不同。

h:commandButton将新的字段值推送到Bean,并且在刷新表单和换行之后它也会出现。

p:commandButton不会将新字段值推送到Bean。刷新表单后,出现新行,但“ repeatName”字段的先前键入的内容为空。

我认为h:commandButton可以正常工作,而p:commandButton不能正常工作。

始终使用h:commandButton和p:commandButton设置“ noRepeatName”字段值。

使用h:commandButton的步骤和结果:

  1. 再按一次按钮(创建新行)。
  2. 键入“ noRepeatName”字段
  3. 键入第一个“ repeatName”字段
  4. 按下按钮

结果:刷新后,出现以前输入的字段内容。

使用p:commandButton的步骤和结果:

  1. 再按一次按钮(创建新行)。
  2. 键入“ noRepeatName”字段
  3. 键入第一个“ repeatName”字段
  4. 按下按钮

结果:刷新后,出现以前键入的“ noRepeatName”字段的内容,但第一个“ repeatName”为空。

我想念什么吗? 为什么不像h:commandButton那样设置提交给bean的第一个“ repeatName”值?

我使用primefaces 6.2.10,jsf 2.2.18(oracle)和spring boot 2.0.6。

JSF代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">
<h:head/>
<h:body>
    <h:form id="repeatForm">
        <h:commandButton value="plus" id="addJsf">
            <f:ajax event="click" immediate="true" render="repeatForm" execute="repeatForm"
                    listener="#{repeatController.add}"/>
        </h:commandButton>
        <p:commandButton icon="fa fa-plus" actionListener="#{repeatController.add}" immediate="true" id="add"
                         process="repeatForm" update="repeatForm"/><br/>
        <p:inputText value="#{repeatData.name}" id="noRepeatName">
            <f:validateLength minimum="30"/>
        </p:inputText><br/>
        <ui:repeat value="#{repeatData.products}" var="product" varStatus="productStatus">
            First: #{productStatus.first}"; Last: #{productStatus.last}; Index: #{productStatus.index}<br/>
            <p:inputText value="#{product.name}" id="repeatName">
               <f:validateLength minimum="20"/>
            </p:inputText><br/>
        </ui:repeat>
    </h:form>
</h:body>
</html>

Java bean

@Named
@Scope("view)
public class RepeatData {
    private List<Product> products = new ArrayList<>();

    private String name;

    public List<Product> getProducts() {
        return products;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

产品

public class Product {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

控制器

@Named
@Scope("request")
public class RepeatController {
    @Autowired
    private RepeatData repeatData;

    public void add() {
        repeatData.getProducts().add(new Product());
    }
}

0 个答案:

没有答案