代码之家  ›  专栏  ›  技术社区  ›  Tuukka Mustonen

使用JSF 2.0获取命名容器内组件clientid的完整前缀

  •  15
  • Tuukka Mustonen  · 技术社区  · 16 年前

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

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

    作为 <h:messages /> 居住在外面 <h:form /> 我必须在ID前面加冒号( : )这是可行的。

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

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

    2 回复  |  直到 13 年前
        1
  •  24
  •   Tuukka Mustonen    16 年前

    似乎可以通过表达式语言(el)隐式对象访问当前前缀( cc 和 component ):

    • 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: working with component identifiers (id/clientId) . 它声明这是JSF 2.0的一个新特性。在此之前,必须通过编程方式从支持bean中获取ID。

        2
  •  0
  •   sasynkamil    14 年前

    @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)MyFr:CCC

    4)肌形态:AAA

    注:所以第1和第3个具有相同的输出。