【问题标题】:JSF Composite component disabled attributeJSF 复合组件禁用属性
【发布时间】:2017-01-30 20:02:09
【问题描述】:

这是我的复合组件的 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);
} 

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

【问题讨论】:

    标签: primefaces jsf-2.2


    【解决方案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"> 
    

    【讨论】:

    • 您能解释一下为什么您认为这是解决方案吗?
    • 对于 cc:attribute,你不需要用布尔值来复杂化生活;真实的| false 字符串或布尔值相同。对于 p:panel,您使用的是 p:ajax,因此您需要直接更新 jsf 组件而不是 html。
    • 复杂与否,使用布尔值会是一个问题吗? (顺便说一句,反对票不是来自我)。为什么给span 一个id 是个问题?我不是说你错了,我正在努力学习并为其他人获取更详细的信息,以便他们也可以学习
    • 当你想禁用一个 inputText 时,你总是可以写 disabled="false" 或 disabled="#{false}" 但第一个很简单。对于 jsf 来说,有一个值得尊重的生命周期。 h 或 p 标签被翻译成 HTML,所以如果你想直接更新 html,你必须从源代码中检索最终的 ID。
    • 好的,所以第一部分是关于“美丽”(这总是在旁观者的眼中)但是关于第二部分,你确定吗:stackoverflow.com/questions/9726818/…
    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 2012-01-09
    • 2011-10-09
    • 2012-04-09
    • 2011-07-24
    • 2011-02-24
    • 2017-11-11
    • 2012-08-25
    相关资源
    最近更新 更多