【问题标题】:primefaces uiViewRoot find component inside <p:dataTable >primefaces uiViewRoot 在 <p:dataTable > 中查找组件
【发布时间】:2012-05-22 14:30:11
【问题描述】:

我正在使用 primefaces 3.2。

我遇到了以下情况:

<h:form id="someForm">
  ..
  <p:dataTable id="someDataTable" value="#{BackingBean.list}" var="element" ..>
    <p:column>
      <p:calendar id="someCalendar" value=#{element.date} ../>
      <p:message id="someCalendarMessage" for=":someForm:someDataTable:someCalendar"/>
    <p:column>
  </p:dataTable>    
  ..
</h:form>

“someDataTable”动态更新,然后将所有数据提交到服务器端。如果输入的日期不满足某些条件,我想在支持 bean 中发送日历“someCalendar”的消息。我尝试使用此代码查找组件:

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage(facesContext.getViewRoot().findComponent(":someForm:someDataTable:" + "i" + ":someCalendar").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, Utils.getResourceBundleString("dictionary", "error") + ":", Utils.getResourceBundleString("dictionary", "some_message")));
return;

其中 i 是数据表中“元素”的索引,与位于 BackingBean 中的列表中的索引相同。

问题是我得到 NullPointerException,因为 facesContext.getViewRoot().findComponent(..) 方法找不到组件,尽管我在视图中检查了生成的日历 ID,它是 :som​​eForm:someDataTable:0:someCalendar 用于第一个元素,它应该是 :someForm:someDataTable:1:someCalendar 用于下一个元素等。

为什么 facesContext.getViewRoot().findComponent(..) 方法找不到里面的组件?是动态更新的,可能提交完成后服务器端没有得到更新的组件树?

提前致谢。

【问题讨论】:

    标签: jsf datatable primefaces components


    【解决方案1】:

    这是因为p:dataTable 是一个重复的组件,并且在视图构建期间,视图根中只有一个日历。它的 ID 为 someForm:someDataTable:someCalendar

    仅在视图呈现期间创建表行并生成与行相关的 ID。

    您应该使用 JSF 内置验证工具来检查您的日期:

    在视图中:

    <p:calendar id="someCalendar" value=#{element.date} 
                validator="#{BackinBean.validateDate}"/>
    <p:message id="someCalendarMessage" for="someCalendar"/>
    

    for属性中的someCalendar就足够了)

    在后台bean中:

    public void validateDate(
                   FacesContext context, 
                   UIComponent component, 
                   Object value) throws ValidatorException {
    
            if (/* date is not valid */) {
                throw new ValidatorException(
                   new FacesMessage("Date is not valid"));
            }
    
    }
    

    验证方法中的 FacesMessage 将自动显示在正确的表格行中。

    【讨论】:

    • 这是否意味着在这种情况下无法进行跨字段验证?
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 2013-08-28
    • 1970-01-01
    • 2011-07-24
    • 2015-07-15
    • 2013-08-09
    • 2014-05-14
    • 1970-01-01
    相关资源
    最近更新 更多