【问题标题】:Acquire full prefix for a component clientId inside naming containers with JSF 2.0使用 JSF 2.0 在命名容器中获取组件 clientId 的完整前缀
【发布时间】:2011-03-30 21:13:40
【问题描述】:

我正在通过 JSF 中的 AJAX 更新组件:

<h:form>
    <h:outputLink>Click me
        <f:ajax event="click" render=":messages" />
    </h:outputLink>
</h:form>

<h:messages id="messages" globalOnly="true" />

由于&lt;h:messages /&gt; 位于&lt;h:form /&gt; 之外,我必须在ID 前面加上冒号(:)。这行得通。

但是,如果我将相同的代码放入组件中并将该组件包含到我的页面中,则代码将失败。原因是:messages 声明是指组件层次结构的根,而我要更新的&lt;h:messages /&gt; 组件实际上位于我的自定义组件下,该组件位于页面下(因此该位置的样式为:myComponent:messages .

在我的组件中,我怎样才能获得&lt;h:messages /&gt; 组件的正确前缀?我知道我可以手动为我的组件分配 ID,并使用它来为引用添加前缀(如 :#{cc.attrs.id}:messages)。但是,我不知道该组件位于组件层次结构的哪个级别,因此所需的前缀甚至可能类似于:foo:bar:x:y:messages

【问题讨论】:

    标签: java jsf reference components jsf-2


    【解决方案1】:

    @Tuukka Mustonen,谢谢你的回答。

    如果我们需要从同一个“地方”访问另一个 id,我们可以使用:

    <h:outputScript name="js/my-script.js"/>
    <h:form id="myForm">
        <h:inputText id="aaa"
            onkeyup="myJSFunction(this.id)"
            value="..."
        />
        <h:inputText id="bbb"
            onkeyup="myJSFunction(aaa.id)"
            value="..."
        />
        <h:inputText id="ccc"
            onkeyup="myJSFunction('#component.parent.clientId.concat(':ccc')}')"
            value="..."
        />
        <h:inputText id="ddd"
            onkeyup="myJSFunction('#component.parent.clientId.concat(':aaa')}')"
            value="..."
        />
    </h:form>
    

    JavaScript 函数:

    function myJSFunction(message) {
        window.alert(message)
    }
    

    对话窗口的输出:

    1) 我的表单:aaa

    2)

    3) 我的表单:ccc

    4) 我的表单:aaa

    注意:所以第 1 和第 3 的输出相同。

    【讨论】:

      【解决方案2】:

      似乎您可以通过表达式语言 (EL) 隐式对象(cccomponent)访问当前前缀:

      • cc.clientId 返回当前 composite 组件的前缀
      • component.clientId 返回任何当前组件的前缀。

      例如,在一个页面中,通过调用某个组件

      <myComponent id="foo">
      

      在这个组件中,可以像这样获取客户端 ID:

      <h:outputText id="bar">
         <p>ClientId for the composite component: #{cc.clientId}</p>
         <p>ClientId for current any component: #{component.clientId}</p>
      </h:outputText>
      

      以下内容应打印为:

      ClientId for the composite component: foo
      ClientId for current any component: foo:bar
      

      我从博客文章 JSF: working with component identifiers (id/clientId) 中得到了指针。它指出这是 JSF 2.0 的一个新特性。在此之前,必须以编程方式从支持 bean 获取 ID。

      【讨论】:

        猜你喜欢
        • 2010-12-02
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 2015-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多