0

是否可以引用一个 id 来标识作为 parent-parent-naming 容器的子组件的组件?

例如:

<div class="browserDiv"
            id="browserObjects">
            <p:selectOneRadio id ="selectedFolder" value="${cc.attrs.value.selectedObjectPath}" layout="custom">
                <f:selectItems value="${cc.attrs.value.objectList}"
                                var="object" itmeValue="${object.path}" itemLabel=""/>
            </p:selectOneRadio>

            <table>
                <ui:repeat var="object" value="${cc.attrs.value.objectList}" id ="repeat" varStatus="status" >
                        <tr>
                            <td class="checkBoxCell">
                                <p:radioButton id="radioButton_${object.path}" for="selectedFolder" itemIndex="#{status.index}"/>
                            </td>
                        </tr>
                </ui:repeat>
            </table>

        </div>

我想selectedFolder从 for 属性中引用 id <p:radioButton>。但既然<ui:repeat>是 a NamingContainerselectedFolder就存在于另一个中NamingContainer,我看不出如何引用它。是否可以写类似的东西for="../selectedFolder"

我不能使用绝对 id 引用,因为这是复合组件的一部分。我也尝试过使用prependId="false"in <ui:repeat>,但没有奏效。

4

1 回答 1

0

使用绝对客户端 ID 而不是相对客户端 ID。

假设你有一个

<h:form id="form">
    <p:selectOneRadio id="radio" ...>
        ...
    </p:selectOneRadio>
</h:form>

那么它的绝对客户 ID 将是form:radio. 这正是您在生成的 HTML 源代码中看到的值。要从另一个命名容器中引用它,您需要在它前面加上(默认)命名容器分隔符:,以便它变为:form:radio. 所以,这应该这样做:

<p:radioButton for=":form:radio" ... />

与具体问题无关,您正在使用${}而不是#{}几乎无处不在。虽然${}在仅显示值中可能工作正常,但在您提交表单时它根本不起作用。你真的需要#{}。它不仅做get,而且做set,而${}只做get。只需坚持#{}所有 JSF 页面。

也可以看看:


根据评论进行更新,目前尚不清楚命名容器都放置在组合中的位置,但如有必要,您可以动态解析组合的绝对客户端 ID,如下所示:

<p:radioButton for=":#{cc.clientId}:radio" ... />
于 2012-01-16T15:08:58.553 回答