无法从复合组件执行ajax刷新

MyF*_*ist 2 jsf-2

这是我的复合组件:

<composite:interface>
    <composite:attribute name="attr1" />
    <composite:clientBehavior name="xyz" event="valueChange" targets="chkbox" />
</composite:interface>
<composite:implementation>
    <h:panelGrid>
    <h:panelGroup>
        <h:selectBooleanCheckbox id="chkbox"
                value="#{cc.attrs.attr1}">
            </h:selectBooleanCheckbox>
    </h:panelGroup>
</h:panelGrid>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)

我的页面:

<h:form id="myForm">
  <cc:myComp attr1="#{myBean.someAttr}">
    <f:ajax render="myform:grid1" event="xyz" listener="{myBean.listenerMethod}"/>
  </cc:myComp>

  <h:panelGrid id="grid1">
      <h:panelGroup>
         <h:inputTextarea id="rationale" rows="4" cols="70"
                value="#{myBean.rationale}" />
      </h:panelGroup>
  </h:panelGrid>
</h:form>
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

<f:ajax> 包含一个未知的id'myForm:grid1' - 无法在组件chkbox的上下文中找到它

如果我render="myform:grid1"从我的代码中删除,那么ajax调用工作正常.基本上从我的复合组件我不能引用另一个OUTSIDE组件.这是怎么造成的,我该如何解决?

Bal*_*usC 5

<f:ajax render="myform:grid1">
Run Code Online (Sandbox Code Playgroud)

任何不以NamingContainer分隔符开头的客户机ID (在您的情况下:)都是相对于最近的NamingContainer父项.最接近的NamingContainer父级在您的特定情况下是复合组件本身.因此,此构造基本上是在寻找具有myform:XXX:myform:grid1相对于复合组件XXX的完整客户端ID的组件,其中是复合组件的自动生成ID.但是,没有此完整客户端ID的组件.

假设面板网格的完整客户端ID确实存在myform:grid1(即,当您在浏览器中打开页面时,右键单击并查看源,您确实看到了<table id="myform:grid1">),那么您应该将其作为绝对客户端ID,而不是在其前面加上NamingContainer分隔符字符:

<f:ajax render=":myform:grid1">
Run Code Online (Sandbox Code Playgroud)

也可以看看: