gpt4 book ai didi

java - JSF / not rendering according to boolean value

转载 作者:行者123 更新时间:2023-11-30 04:05:22 24 4
gpt4 key购买 nike

我有一个<h:dataTable>它由实体类填充并显示不同的产品。我希望能够单击<h:commandLink>并编辑链接所属的行。我的结构与这个很好的例子和文章大致相同,位于mkyong .

表格(排除一些列):

<h:form>
<h:dataTable id="gnomeTable" value="#{gnome.productList}"
var="item"
styleClass="gnomeTable"
headerClass="gnomeTableHeader"
rowClasses="gnomeTableOddRow,gnomeTableEvenRow"
bgcolor="#F1F1F1" border="10" cellspacing="2"
rules="all" >

<f:facet name="header">
<h:outputText value="List of available gnomes for sale" />
</f:facet>

<h:column>
<f:facet name="header">
<h:outputText value="GnomeID" />
</f:facet>
<h:outputText value="#{item.id}"></h:outputText>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="Name"/>
</f:facet>
<h:outputText value="#{item.name}" rendered="#{not item.editable}"></h:outputText>
<h:inputText value="#{item.name}" rendered="#{item.editable}"></h:inputText>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="Available"/>
</f:facet>
<h:outputText value="#{item.available}" rendered="#{not item.editable}"></h:outputText>
<h:inputText value="#{item.available}" rendered="#{item.editable}"></h:inputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Edit"/>
</f:facet>
<h:commandLink value="Edit" action="#{gnome.editAction(item)}" rendered="#{not item.editable}" />
</h:column>
</h:dataTable>
<h:commandButton value="Save Changes" action="#{gnome.saveAction}" />
</h:form>

Bean 方法:

public String saveAction() {
for (Gnome g : productList) {
g.setEditable(false);
}
return null;
}

public String editAction(Gnome gnome) {
gnome.setEditable(true);
return null;
}

该属性(property)boolean editable在实体类中被注释为@Transient,因为它不是持久数据的一部分,并且我不希望实体管理器接触它:

@Transient
private boolean editable;

我认为这会导致 boolean单击“编辑”按钮时,变量设置为 true,该行重新呈现,字段现在为 <h:inputText> ,但什么也没发生。我已经对其进行了调试并确保该变量设置为 true,确实如此。

我还发现了这个SO question我认为这可能与我遇到的问题类似。但不同之处在于,刷新页面不会改变任何内容。

我错过了什么?

编辑 1:在这个问题的第一个版本中,我错误地粘贴了错误的代码。现在包含的代码是我当前的代码,理论上应该可以工作,但不能。

编辑 2:productList 的初始化,其中Gnome是实体类。

private List<Gnome> productList = new ArrayList<>();

public List<Gnome> getProductList() {
productList = gnomeFacade.findAll();
return productList;
}

public void setProductList(List<Gnome> productList) {
this.productList = productList;
}

最佳答案

测试您的示例后,唯一可能的错误是您正在使用 RequestScoped bean。为了使其工作,您至少需要 ViewScopedSessionScoped。否则,productList 更改的内容会在每次请求(按钮操作)时丢失。

根据编辑,第二个错误是如何获取数据。您需要将数据加载到 getter 之外的其他位置,如下所示:

@PostConstruct
public void init()
{
productList = gnomeFacade.findAll();
}

public List<Gnome> getProductList()
{
return productList;
}

否则,每次执行操作时,您的列表都会重置。

关于java - JSF <h :inputText>/<h:outputText> not rendering according to boolean value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20908283/

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