我需要使用一个列表框来显示数据库中的一些值,并在选择列表中的单个值时进行进一步处理。
在PrimeFaces展示网站上,该示例将固定(静态)数据加载到列表框中,每个列表项都有一个PrimeFaces命令。当我可能事先不知道项目数时,如何动态显示列表框中的项目?
我还需要在textarea中显示与列表中所选项目相对应的一些文本。我是否必须为此目的使用事件监听器?我想在开头留空文本区域。只有在列表框中选择了一个值时,我才想使用bean来检索和存储使用该textarea的数据。这可能吗?我该如何实现呢?
答案 0 :(得分:3)
当我可能事先不知道项目数量时,如何动态显示列表框中的项目?
使用绑定到List<T>
属性的<f:selectItems>
。基本示例,假设您使用EJB / JPA与DB交互:
private Item selectedItem; // +getter+setter
private List<Item> availableItems; // +getter
@EJB
private ItemService service;
@PostConstruct
public void init() {
availableItems = service.list();
}
与
<p:selectOneListbox value="#{bean.selectedItem}" converter="itemConverter">
<f:selectItems value="#{bean.availableItems}" var="item"
itemValue="#{item}" itemLabel="#{item.someLabel}" />
</p:selectOneListbox>
itemConverter
应该实现javax.faces.convert.Converter
并在Item
中将getAsString()
对象转换为其唯一的字符串表示形式(通常是其数据库标识符),然后转换为getAsObject()
{1}}。
我还需要在textarea中显示与列表中所选项目相对应的文本。我是否必须为此目的使用事件监听器?
只需将<p:ajax>
(PrimeFaces相当于标准JSF <f:ajax>
)放入更新textarea的列表框中。 E.g。
<p:selectOneListbox value="#{bean.selectedItem}" converter="itemConverter">
<f:selectItems value="#{bean.availableItems}" var="item"
itemValue="#{item}" itemLabel="#{item.someLabel}" />
<p:ajax update="textarea" />
</p:selectOneListbox>
<p:inputTextarea id="textarea" value="#{bean.selectedItem.someText}" />
选择项目时会调用它。
h:selectOneMenu
wiki page - 同样适用于PrimeFaces p:selectOneListbox
答案 1 :(得分:1)
是的,出于演示目的,大多数示例都加载了静态数据。但是如果你看一下PF展示的相同例子,第二个列表框代码如下:
<h:outputText value="Scrollbar: " />
<p:selectOneListbox id="scroll" value="#{autoCompleteBean.selectedPlayer1}"
converter="player" style="height:100px">
<f:selectItems value="#{autoCompleteBean.players}"
var="player" itemLabel="#{player.name}" itemValue="#{player}" />
</p:selectOneListbox>
和f:selectItems value属性可以指向集合,数组,映射或SelectItem实例。因此,在上面的示例中,播放器可以是使用托管bean中的数据库填充的任何列表。
但是如果实例不是SelectItem,则通过在每个对象上调用toString来获取标签,最后将所选的itemValue设置为selectedPlayer1属性,但是您还可以看到之间存在转换器,因此传入的itemValue string被转换回播放器对象,然后设置为selectedPlayer1。
如果要在文本区域中显示所选项目,可以执行以下操作:
<h:outputText value="Scrollbar: " />
<p:selectOneListbox id="scroll" value="#{autoCompleteBean.selectedPlayer1}"
converter="player" style="height:100px">
<f:selectItems value="#{autoCompleteBean.players}"
var="player" itemLabel="#{player.name}" itemValue="#{player}" />
<p:ajax update="displayArea"/>
</p:selectOneListbox>
<p:inputTextarea id="displayArea" value="#{autoCompleteBean.selectedPlayer1}" />
这里使用ajax更新inputTextarea,其中包含用户选择的值。