18

我有一个模板,在它的定义中我使用了几个表单和按钮。

问题是定义(define)xhtml 文件不知道组件层次结构。

例如,我想在同一个定义文件中以不同的形式更新元素“table2”。

模板插入:

<p:tabView id="nav"> <!-- nav -->
    <ui:insert name="content_nav">content navigation</ui:insert>
</p:tabView>

定义我的层次结构的第一级“导航”

模板定义:

<ui:define name="content_nav">
    <h:form id="form1"> <!-- nav:form1 -->
        <h:dataTable id="table1"/> <!-- nav:form1:table1 -->
        <p:inputText value="#{bean.value}"/>
        <p:commandButton action="..." update="nav:form2:table2"/>
    </h:form>
    <h:form id="form2">
        <h:dataTable id="table2"/> <!-- nav:form2:table2 -->
        <!-- other elements -->
    </h:form>
</ui:define>

在我的定义部分,我不想知道“导航”!

我怎样才能做到这一点?或者我怎样才能向上移动一个命名组件?或者将最高父级完整ID保存在一个变量中?

有时我看到类似的东西:

update=":table2"

但是我找不到任何关于这个的信息?JavaEE 6 文档只提到了 @ 关键字。

4

5 回答 5

52

丑陋,但这应该适合你:

<p:commandButton action="..." update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2" />

由于您已经在使用 PrimeFaces,另一种方法是使用#{p:component(componentId)},此辅助函数扫描整个视图根以查找具有给定 ID 的组件,然后返回其客户端 ID:

<p:commandButton action="..." update=":#{p:component('table2')}" />
于 2012-01-13T12:59:31.693 回答
1

丑陋的答案效果很好

update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2

主要是从打开的对话框更新到父数据表更有用

于 2013-02-28T15:21:44.290 回答
1

您可以使用binding属性来声明绑定到 JSF 组件的 EL 变量。然后您可以使用javax.faces.component.UIComponent.getClientId(). 请参见下面的示例:

<t:selectOneRadio 
   id="yourId"
   layout="spread"
   value="#{yourBean.value}"
   binding="#{yourIdComponent}">
       <f:selectItems value="#{someBean.values}" />
</t:selectOneRadio>
<h:outputText>
   <t:radio for=":#{yourIdComponent.clientId}" index="0" />
</h:outputText>
于 2016-04-25T10:05:56.903 回答
0

尝试这个:

<h:commandButton value="Click me">
    <f:ajax event="click" render="table" />
</h:commandButton>
于 2012-01-13T07:58:46.830 回答
0

除了上述解决方案之外,我还遇到了一个问题,即我必须根据服务器端逻辑(可能更难找出嵌套)动态生成要更新的组件(很多)。

因此,服务器端的解决方案等效于update=":#{p:component('table2')}"1,它使用org.primefaces.util.ComponentUtils.findComponentClientId( String designId )

// UiPnlSubId is an enum containing all the ids used within the webapp xhtml.
// It could easily be substituted by a string list or similar.
public static String getCompListSpaced( List< UiPnlSubId > compIds ) {

    if ( compIds == null || compIds.isEmpty() )
        return "" ;
    StringBuffer sb = new StringBuffer( ":" ) ;
    for ( UiPnlSubId cid : compIds )
        sb.append( ComponentUtils.findComponentClientId( cid.name() ) ).append( " " ) ;
    return sb.deleteCharAt( sb.length() - 1 ).toString() ;  // delete suffixed space
}

通过使用它的其他方法调用,例如... update="#{foo.getCompListComputed( 'triggeringCompId' )}".

1:首先我尝试在没有太多思考的情况下返回public static String getCompListSpaced0() { return ":#{p:component('table2')}" ; }一个... update="#{foo.getCompListSpaced0()}表达式,当然(在考虑了框架的工作原理之后:))没有解决(按原样返回)并且可能会导致一些用户遇到问题。此外,我的 Eclipse / JBoss Tools 环境建议编写:#{p.component('table2')}(“。”而不是“:”),这没有帮助 - 当然。

于 2016-01-21T13:14:48.233 回答