【问题标题】:conditional rendered f:selectItem possible problems条件渲染 f:selectItem 可能出现的问题
【发布时间】:2013-01-25 15:41:58
【问题描述】:

我有一个包含多个h:selectOneMenup:selectOneMenu 的页面,我想使用同一个页面来编辑和添加数据。 当我编辑数据时,我需要f:selectItem。我知道这个组件没有渲染属性。我读到我可以使用<c:if>

好的。例如,如果我写

<p:selectOneMenu rendered="#{not empty bean.id}"
    value="#{bean.selectedId}">
    <c:if test="${editableBean != null}">
        <f:selectItem itemLable="#{editableBean.name} itemValue=#{editableBean.id} />
    </c:if>
    <f:selectItems value="#{bean.listItems}" var="item"
        itemLabel="#{item.name}" itemValue="#{item.id}"/>
</p:selectOneMenu>

在 primefaces 和 ajax 侦听器中是否可以正常工作?

【问题讨论】:

  • @GaborSch 如果您不知道 JSF 是如何工作的,请不要添加不能帮助 OP 解决好的解决方案的 cmets。
  • @LuiggiMendoza 我知道 JSF 是如何工作的,但我希望 OP 在他问之前尝试一下。顺便说一句,答案是YesNo,所以这不是一个好问题。
  • @GaborSch 如果您知道 JSF 是如何工作的,那么您已经知道 OP 的建议不是最好的解决方案 =\,如果您真的知道,请提供答案:)。
  • @LuiggiMendoza 我们不要为此而战。 OP 想知道解决方案(一段代码)是否有效。要决定这个问题,必须有人尝试。

标签: jsf jsf-2 selectonemenu rendered-attribute


【解决方案1】:

简单的解决方案(但性能较差)是在托管 bean 中使用 boolean editMode 属性来启用/禁用组件。基本示例:

<p:selectOneMenu rendered="#{not empty bean.id}" disabled="#{bean.editMode}"
    value="#{bean.selectedId}">
    <f:selectItems value="#{bean.listItems}" var="item"
        itemLabel="#{item.name}" itemValue="#{item.id}"/>
</p:selectOneMenu>

在你的豆子里

@ManagedBean
@ViewScoped
public class Bean {

    private int id;
    private boolean editMode;
    //other attributes...
    //getters and setters...

    @PostConstruct
    public void init() {
        //a way to know if the bean it's in edit mode
        editMode = (id != 0);
    }
}

此解决方案的性能会很差,因为每个&lt;p:selectOneMenu&gt; 都必须加载所有数据然后选择实际值,但它会做你想做的事。另一种选择是将此属性用于&lt;p:selectOneMenu&gt;rendered 属性和&lt;h:inputText disabled="true" readonly="true" /&gt;(或者可能是&lt;h:outputText /&gt;)。另一个基本示例:

<p:selectOneMenu rendered="#{not empty bean.id && not bean.editMode}"
    value="#{bean.selectedId}">
    <f:selectItems value="#{bean.listItems}" var="item"
        itemLabel="#{item.name}" itemValue="#{item.id}"/>
</p:selectOneMenu>

<h:inputText rendered="#{bean.editMode}" value="{bean.selectedText}"
    disabled="true" readonly="true" />

【讨论】:

  • 也许我能正确理解这个问题,但我们不能有条件地更改与f:selectItems 连接的支持集合吗?
  • @GanGnaMStYleOverFlowErroR 这可能是另一种解决方案,但我倾向于在 @ApplicationScoped 托管 bean 中拥有几乎所有 &lt;f:selectItems&gt; 列表,并不时更新值而不是获取列表值每个请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2017-08-21
相关资源
最近更新 更多