gpt4 book ai didi

jsf - 用户界面 :repeat add new item not working in first element

转载 作者:行者123 更新时间:2023-12-02 20:08:26 25 4
gpt4 key购买 nike

我目前正在尝试通过添加/删除素面来做一个简单的输入列表 p:commandButton .

我在 Glassfish 4.1.1 上使用 PrimeFaces 6.2Mojarra 2.2.12

ExampleBean.java

package /* myPackage */;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javafx.util.Pair;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named(value = "exampleBean")
@SessionScoped
public class ExampleBean implements Serializable {

private List<Pair<Integer, Integer>> list;

@PostConstruct
public void init() {
list = new ArrayList<>();
addNewItem();
}

public void addNewItem() {
list.add(new Pair<>(1, 300));
}

public List<Pair<Integer, Integer>> getList() {
return list;
}

public void setList(List<Pair<Integer, Integer>> list) {
this.list = list;
}
}

example.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:jsf="http://xmlns.jcp.org/jsf">

<h:head>
<title>Example</title>
<meta charset="utf-8" />
</h:head>

<h:body>
<h:form id="example-form">
<div jsf:id="example-container">
<ui:repeat value="#{exampleBean.list}" var="item" varStatus="status">
<div>
<p:inputText value="#{item.key}" />
<p:inputText value="#{item.value}" />

<p:commandButton
value="Delete"
actionListener="#{exampleBean.list.remove(item)}"
process="@this"
update="example-form:example-container"
rendered="#{!status.first}" />

<p:commandButton
value="Add"
actionListener="#{exampleBean.addNewItem()}"
process="@this"
update="example-form:example-container"
rendered="#{status.first}" />
</div>

</ui:repeat>
</div>
</h:form>
</h:body>
</html>

rendered我的每个p:commandButton的属性,我想仅在第一个项目上显示添加按钮,并在除第一个项目之外的所有项目上显示删除按钮(使其不可删除)。

我的问题是使用 rendered="#{status.first}" 添加按钮使整个事情不起作用。

<p:commandButton ... rendered="#{status.last}" /> <!-- actionListener called -->

<p:commandButton ... rendered="#{true}" /> <!-- actionListener called -->

<p:commandButton ... rendered="#{status.first}" /> <!-- actionListener NOT called -->

rendered="#{status.first}" ,一键点击不打电话actionListener但触发update .

我不知道在第一个项目中显示它而不是在其他项目或最后一个项目中显示它会发生什么变化。

最佳答案

我认为这与<ui:repeat>有关标志并为命令按钮生成唯一的 ID。 View 可能会变得困惑。当您添加其他按钮时,生成的 ID 会发生变化。另外,引入渲染属性也会改变组件的处理方式。

因此,要解决此问题,我认为您需要重新处理 ui:repeat组件和命令按钮以获得有效的操作 URL。解决方案很简单 - 删除 process="@this" .

我用一个可行的解决方案调整了您的示例(该示例使用 Lombok);

@Data @Named @ViewScoped
public class ExampleBean implements Serializable {

private List<IntegerPair> list;

@PostConstruct
private void init() {
list = new ArrayList<>();
addNewItem();
}

public void addNewItem() {
list.add(new IntegerPair(1, 300));
}

@Data
@AllArgsConstructor
public class IntegerPair {
private int key, value;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui"
xmlns:jsf="http://xmlns.jcp.org/jsf">

<h:head>
<title>Example</title>
<meta charset="utf-8" />
</h:head>

<h:body>
Test!
<h:form id="example-form">
<div jsf:id="example-container">
<ui:repeat value="#{exampleBean.list}" var="item" varStatus="status">
<div>
<p:inputText value="#{item.key}" />
<p:inputText value="#{item.value}" />

<p:commandButton
value="Delete"
actionListener="#{exampleBean.list.remove(item)}"
update="example-form:example-container"
rendered="#{!status.first}" />

<p:commandButton
value="Add"
actionListener="#{exampleBean.addNewItem}"
update="example-form:example-container"
rendered="#{status.first}" />
</div>

</ui:repeat>
</div>
</h:form>
</h:body>
</html>

注意 IntegerPair类(class)?我必须介绍这个是因为 Pair<> JavaFX 中定义的类没有可写的键属性 - JSF 在处理输入组件的支持 bean 值时需要可写的属性。

坦白说,您面临的问题源于 <ui:repeat>组件/标签,正在做process="example-form:example-container"您的命令按钮也应该可以正常工作 - 只需确保 <ui:repeat>包含在处理阶段。

关于jsf - 用户界面 :repeat add new item not working in first element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54771179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com