У меня есть список в области видимости бобов. # {RepeatController.add} новый объект в списке. Он также вызывает h: commandButton и p: commandButton.
Моя проблема в том, что когда у меня появляется новая строка, вводящая что-то в поле «repeatName», после нажатия h: commandButton или p: commandButton они работают по-разному.
h: commandButton помещает новое значение поля в bean-компонент, и оно появляется после обновления формы и новой строки.
p: commandButton не выдвигает новое значение поля в bean-компонент. После обновления формы появилась новая строка, но ранее набранное содержимое поля «repeatName» пусто.
Я думаю, что h: commandButton работает нормально, p: commandButton не работает нормально.
Значение поля «noRepeatName» всегда устанавливается с помощью h: commandButton и p: commandButton.
Шаги и результат с помощью h: commandButton:
- нажмите кнопку (создать новую строку) несколько раз.
- введите в поле "noRepeatName"
- введите первое поле «repeatName»
- нажать на кнопку
Результат: после обновления появилось ранее набранное содержимое поля.
Шаги и результат с помощью p: commandButton:
- нажмите кнопку (создать новую строку) несколько раз.
- введите в поле "noRepeatName"
- введите первое поле «repeatName»
- нажать на кнопку
Результат: после обновления появилось ранее набранное содержимое поля «noRepeatName», но первое «repeatName» пусто.
Я что-то пропустил?
Почему не установить значение первого «repeatName», поданного в bean-компонент, как с помощью h: commandButton?
Я использую 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
@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());
}
}