微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不通过工作

我有一个具有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>

当我在我的页面中使用这个复合组件时,如下所示:

<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>

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>

我错过了什么?
(谢谢)

解决方法

在< f:ajax render>中指定的任何相对客户端ID相对于组件树中的父 ClientBehaviorHolder组件解析.在您的特定情况下,这实际上是< h:selectOneRadio>.因此,在与< h:selectOneRadio>相同的命名容器父中寻找具有客户机ID reg-unkNown的组件,其是< cc:implementation>本身(您可能已经知道复合组件实现了 NamingContainer).但是,所需的组件不在那里.

您最好指定一个绝对客户端ID(因此,从:开始,以便相对于UIViewRoot寻找它).您可以通过两种通用方式实现此目的:

>硬编码(假设这一切都在ID表格的表格内):

<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>

>引用UIComponent#getClientId()(如果父命名容器的ID未知):

<h:form ...>
    <question:yesNo ...>
        <f:ajax event="alter" render=":#{regUnkNown.clientId}" />
    </question:yesNo>
    ...
    <h:panelGroup binding="#{regUnkNown}" ...>
        ...
    </h:panelGroup>
</h:form>

这确实很尴尬.这曾被报道为Mojarra issue 1510,但他们并不认为它是一个错误,因为复合组件本身不应该对复合组件之外的其他组件有任何了解(尽管解决方案理论上很简单:如果< ; f:ajax render>不以:或@开头,然后用复合组件父级的客户端ID作为前缀.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐