在使用 JSF 2.0 命名容器内获取组件客户端 Id 的完整前缀

2022-09-03 06:00:14

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

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

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

由于驻留在外面,我必须在ID前面加上冒号()。这有效。<h:messages /><h:form />:

但是,如果我将此相同的代码放入组件中并将该组件包含在我的页面中,则代码将失败。原因是声明引用了组件层次结构的根,而我要更新的组件实际上驻留在我的自定义组件下,该组件位于页面下(因此该位置是样式的 。:messages<h:messages />:myComponent:messages

在我的组件中,如何实现组件的正确前缀?我知道我可以手动将ID分配给我的组件,并使用它来作为引用的前缀(如)。但是,我不知道此组件位于组件层次结构的哪个级别,因此所需的前缀甚至可能类似于 。<h:messages />:#{cc.attrs.id}:messages:foo:bar:x:y:messages


答案 1

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

  • cc.clientId返回当前复合组件的前缀
  • 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:使用组件标识符(id / clientId)中获得指针。它指出这是 JSF 2.0 的新功能。在此之前,必须以编程方式从后备豆中获取ID。


答案 2

@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个具有相同的输出。