Mar*_*k W 4 ajax composite-component jsf-2.2
我有一个具有ajax的复合组件:
<composite:interface>
<composite:attribute name="question" required="true"/>
<composite:attribute name="value" required="false"/>
<composite:attribute name="id" required="true" />
<composite:clientBehavior name="alter"
event="change" targets="input"/>
</composite:interface>
<composite:implementation>
<label for="#{cc.attrs.id}">
<h:outputText value="#{cc.attrs.question}" />
</label>
<div class="fld">
<h:selectOneRadio value="#{cc.attrs.value}" id="input">
<f:selectItem itemValue="true" itemLabel="Yes" />
<f:selectItem itemValue="false" itemLabel="No" />
</h:selectOneRadio>
</div>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)
当我在我的页面中使用这个复合组件时,如下所示:
<question:yesNo question="#{myMSG['knowRegQuestion']}" value="#{vehicle.regKnown}" id="is-reg-known">
<f:ajax event="alter" render="reg-unknown" />
</question:yesNo>
......
<h:panelGroup id="reg-unknown" styleClass="questionGroup man-veh-srch">
......
<h:selectOneListbox value="#{vehicle.model}" size="1" rendered="#{vehicle.regKnown eq 'true'}">
......
</h:selectOneListbox>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
ajax正在触发,模型正在正确更新,但渲染不会改变.(我尝试过各种EL表达式)另外abax响应在firebug中看起来不正确:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1"><changes><update id="j_id1:javax.faces.ViewState:0"><![CDATA[-2911901889097730230:4227240037100614528]]></update></changes></partial-response>
Run Code Online (Sandbox Code Playgroud)
我错过了什么?(谢谢)
Bal*_*usC 10
指定的任何相对客户端ID <f:ajax render>相对于ClientBehaviorHolder组件树中的父组件进行解析.在你的特殊情况下,这实际上是<h:selectOneRadio>.与客户端ID的组件reg-unknown因此正寻求在相同的命名容器的父为<h:selectOneRadio>,这是<cc:implementation>本身(你可能已经知道,复合组件实现NamingContainer).但是,所需的组件不在那里.
你最好指定一个绝对的客户端ID(因此,从:那里开始,以便相对于它寻找它UIViewRoot).您可以通过两种通用方式实现此目的:
硬编码(假设这一切都在带有ID的表单内form):
<h:form id="form">
<question:yesNo ...>
<f:ajax event="alter" render=":form:reg-unknown" />
</question:yesNo>
...
<h:panelGroup id="reg-unknown" ...>
...
</h:panelGroup>
</h:form>
Run Code Online (Sandbox Code Playgroud)引用UIComponent#getClientId()(如果父命名容器的ID未知):
<h:form ...>
<question:yesNo ...>
<f:ajax event="alter" render=":#{regUnknown.clientId}" />
</question:yesNo>
...
<h:panelGroup binding="#{regUnknown}" ...>
...
</h:panelGroup>
</h:form>
Run Code Online (Sandbox Code Playgroud)这确实很尴尬.这曾被报道为Mojarra 问题1510,但他们并不认为它是一个错误,因为复合组件本身不应该对复合组件之外的其他组件有任何了解(尽管解决方案理论上很简单:如果<f:ajax render>不以:或开头@,然后用复合组件父级的客户端ID作为前缀.