JSF Composite组件已禁用属性

时间:2017-01-30 20:02:10

标签: primefaces jsf-2.2

这是我的复合组件的xhtml部分:

    <cc:interface componentType="partnerSelComp">
        <cc:attribute name="value" type="java.lang.Long"/>            
        <cc:attribute name="disabled" type="java.lang.Boolean" default="#{false}"/>            
        <cc:attribute name="service"/>
    </cc:interface>

    <cc:implementation>
        <span id="#{cc.clientId}" style="white-space:nowrap">                                
            <p:inputText id="id" type="hidden" binding="#{cc.partnerId}"/>
            <p:inputText id="code" 
                         binding="#{cc.partnerCode}" 
                         disabled="#{cc.attrs.disabled}" >                     
                <p:ajax event="blur" update="code name msg" listener="#{cc.validate}" />                                                                                                    
            </p:inputText>            
            <p:inputText id ="name" 
                         disabled="true" 
                         binding="#{cc.partnerName}" />                   
            <p:message id="msg" for="code"/>                
        </span>
    </cc:implementation>

我这样称呼它:

<my:PartnerSelComp id="partnerSel" value="#{myBean.partner}" service="#{partnerService}" disabled="true"/>

当最初呈现的组件时,code组件显示为可编辑事件,但指定了disabled="true"。但是在第一次ajax模糊事件之后(我猜因为update)它将获得正确的禁用状态。在支持组件getAttributes().get("disabled")中查询它的值我可以看到正确的值。为什么?如何设置组件的初始外观?

我能够解决它。我不会说一个解决方案,而不是一个不太优雅的解决方法:

@Override
public void encodeAll(FacesContext context) throws IOException {

    Boolean b = (Boolean) getAttributes().get("disabled");
    partnerCode.setDisabled(b);
    super.encodeAll(context);
} 

如果我能理解原始问题是什么,我会很高兴。

1 个答案:

答案 0 :(得分:-1)

试试这个,

 <cc:attribute name="disabled" type="java.lang.String" default="false"/>  

并替换:

<span id="#{cc.clientId}" style="white-space:nowrap"> 

通过

<p:panel id="#{cc.clientId}" style="white-space:nowrap">