gpt4 book ai didi

jsf - 每次使用时在复合组件中获取相同的 `componentType` 实例

转载 作者:行者123 更新时间:2023-11-30 23:55:57 27 4
gpt4 key购买 nike

你好有这个奇怪的问题,我正在使用我编写的 Composite Component 并且我从以前使用 CC 的支持 bean 中获取值(componentType bean )

除了显示代码,我不知道如何更好地描述它。我会尽量简明扼要地删掉多余的部分:这是 Composite Component 定义:

<cc:interface componentType="dynamicFieldGroupList">
<cc:attribute name="coupletClass" />
<cc:attribute name="form" default="@form"/>
<cc:attribute name="list" type="java.util.List" required="true"/>
<cc:attribute name="fieldNames" type="java.util.List" required="true" />
</cc:interface>

<cc:implementation>
<h:dataTable value="#{cc.model}" var="currLine">
<h:column>
<h:outputText id="inner_control_component" value="Inner Look at currLine:#{currLine}"/>
</h:column>
</h:dataTable>
</cc:implementation>

CC bean 定义:

@FacesComponent(value = "dynamicFieldGroupList")
// To be specified in componentType attribute.
@SuppressWarnings({ "rawtypes", "unchecked" })
// We don't care about the actual model item type anyway.
public class DynamicFieldGroupList extends UIComponentBase implements
NamingContainer
{

private transient DataModel model;

@Override
public String getFamily()
{
return "javax.faces.NamingContainer"; // Important! Required for
// composite components.
}

public DataModel getModel()
{
if (model == null)
{
model = new ListDataModel(getList());
}

return model;
}

private List<Map<String, String>> getList()
{ // Don't make this method public! Ends otherwise in an infinite loop
// calling itself everytime.
return (List) getAttributes().get("list");
}

}

以及使用代码:

<ui:repeat var="group" value="#{currentContact.detailGroups}">
<h:panelGroup rendered="#{not empty group.values}">
<h:outputText id="controlMsg" value=" list:#{group.values}" /><br/><br/>
<utils:fieldTypeGroupList list="#{group.values}"
fieldNames="#{group.fields}" coupletClass="utils" />
</h:panelGroup>
</ui:repeat>

id controlMsg 的文本在 #{group.values} 中显示正确的值,而 id inner_control_component 组件内的控件输出显示以前使用的值。

第一次输入的值是正确的...

我想这是使用 CC bean 时的基本错误,否则它可能是 MyFaces 2.1(我正在使用)

的错误

最佳答案

这一行为的解释很简单: View 中只定义了一个组件。因此,一种模型也只有一个支持组件。由于模型是在第一次获取时延迟加载的,因此在父迭代组件的每次迭代中都会重复使用相同的模型。

<ui:repeat>不在 View 构建期间运行(如 JSTL 那样),而是在 View 渲染期间运行。因此, View 中的组件实际上没有 <ui:repeat> 迭代的项目那么多.如果您使用的是 <c:forEach> (或在 View 构建期间运行的任何其他迭代标记),那么复合组件的行为就会如您所愿。

您想更改数据模型在支持组件中的保存方式。您希望为父迭代组件的每次迭代保留一个单独的数据模型。其中一种方法是替换 model属性如下:

private Map<String, DataModel> models = new HashMap<String, DataModel>();

public DataModel getModel() {
DataModel model = models.get(getClientId());
if (model == null) {
model = models.put(getClientId(), new ListDataModel(getList()));
}
return model;
}

另见:

关于jsf - 每次使用时在复合组件中获取相同的 `componentType` 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6485062/

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