【问题标题】:Using h:selectBooleanCheckbox with c:if to obtain row value of a <rich:datatable> - JSF使用 h:selectBooleanCheckbox 和 c:if 来获取 <rich:datatable> 的行值 - JSF
【发布时间】:2013-11-07 18:55:32
【问题描述】:

我使用&lt;rich:datatable&gt; 来显示List&lt;Map&lt;String, String&gt; 的内容

在下面的代码中,spotlightPtBindingsList&lt;Map&lt;String, String&gt;spotlightbinding 代表每个Map&lt;String, String&gt;。在第一列中,我为每一行显示一个 selectBooleanCheckBox。选中 selectbooleancheckboxbockboxboxboxboxboxbockboxbockboxbockboxbockboxboxboxboxbockboxbock Map&lt;String, String&gt;与键“URI”对应的值作为方法: Inserirbean.onselectCheckbox(URI),这就是为什么我将这个值放在名称为 uriui:param 中。这里的问题是,当我尝试打印 inserirBean.onSelectedCheckBox(uri) 中收到的值 uri 时,我没有得到任何输出,就好像它是空的一样.下面是其余的代码:

InsereDocumento.xhtml

<rich:dataTable value="#{inserirBean.spotlightPtBindings}" var="spotlightbinding">

        <rich:column>
                 <f:facet name="header">*</f:facet>
                 <ui:param name="uri" value="#{spotlightbinding['URI']}"/>

                 <h:selectBooleanCheckbox value="#{selectionBean.selected}" />

                    <c:if test="#{selectionBean.selected}">
                        #{inserirBean.onSelectedCheckBox(uri)}"
                    </c:if>

             </rich:column> 

        <c:forEach items="#{inserirBean.variableNamesPt}" var="vname">
             <rich:column>
                 <f:facet name="header">#{vname}</f:facet>
                  #{spotlightbinding[vname]}
             </rich:column> 
         </c:forEach>  


     </rich:dataTable> <br />

SelectionBean

package managedBeans;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class CheckBoxSelectionBean implements Serializable {
    private transient boolean selected = false;
    private static final long serialVersionUID = 1L;

    public CheckBoxSelectionBean() {
        // TODO Auto-generated constructor stub
    }

     public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean selected) {
            this.selected = selected;
        }

}

InserirBean - 我没有在这里展示名为 spotlightPtBindingList&lt;Map&lt;String, String&gt;&gt; 以及如何填充 List&lt;String&gt; variableNamesPt,因为这是一个复杂的过程,但我可以告诉你,它们肯定是填充的,因为我可以在屏幕上看到它们的内容。

@ManagedBean
public class InsereDocumentoBean implements Serializable {

    private static final long serialVersionUID = 1L;

        private List<String> variableNamesPt = new ArrayList<String>();
        private List<Map<String, String>> spotlightPtBindings = new ArrayList<Map<String, String>>();


         public List<String> getVariableNamesPt() {
        return variableNamesPt;
    }

    public List<Map<String, String>> getSpotlightPtBindings() {
        return this.spotlightPtBindings;
    }

          public void onSelectedCheckBox(String uri) {
        System.out.println("URI: " + uri);
    }
}

可能是什么问题?谢谢!我是 JSF 新手,需要您的帮助!

【问题讨论】:

    标签: jsf


    【解决方案1】:

    在 JSF 中渲染是一个两步过程:查看构建时间查看渲染时间。 虽然它们在同一个文件中,但有些标签在视图构建时生效,有些在渲染时生效。

    JSTL 标签,如&lt;c:forEach&gt;&lt;c:if&gt;所有标签处理程序(包括&lt;ui:param&gt;,参见here)在视图构建时进行评估,它们将内容添加到“最终”然后由 JSF 呈现的 xml 树。

    JSF HTML 标记和类似&lt;rich:dataTable&gt; 的派生类在视图渲染时被评估,因此数据表的var 被评估稍后然后&lt;ui:param&gt; 导致spotlightbinding 不被绑定时它被分配给uri

    相反,我建议您分配一个 ajax 侦听器来调用该函数:

    <h:selectBooleanCheckbox value="#{selectionBean.selected}">
        <f:ajax listener="#{inserirBean.onSelectedCheckBox(spotlightbinding['URI'])}" />
    </h:selectBooleanCheckbox>
    

    请注意,只要值更改,就会调用侦听器。

    【讨论】:

    • 解决了!完美的!这是一个巨大的帮助!太感谢了! :))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2017-01-07
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多