部分处理自定义组件ID的奇怪行为

时间:2013-10-07 19:26:14

标签: jsf jsf-2 primefaces

我想要p:inputTextArea的扩展功能。新组件简单,看起来像:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:composite="http://java.sun.com/jsf/composite"
  xmlns:p="http://primefaces.org/ui"
  xmlns:h = "http://java.sun.com/jsf/html">
<composite:interface>
        ...
    <composite:attribute name="maxlength" required="false" default="0"/>
    <composite:attribute name="value" required="true"/>
        ...
</composite:interface>
<composite:implementation>
    <p:inputTextarea id="#{cc.clientId}"
                     value="#{cc.attrs.value}"
                     onkeyup="callJS('#{cc.clientId}', '#{cc.attrs.maxlength}')"/> <!-- This is why i extend p:inputTextarea -->
</composite:implementation>
</html>

我在p:TabView中使用此组件:

    <h:form prependId="false">
        <p:tabView id="tabs">
            <p:tab id="tab1" title="text1">
                <h:outputLabel disabled="true" id="textarea" value="#{testBean.text}"/>
            </p:tab>
            <p:tab title="text2">
                <p:commandLink value="Show dialog" onclick="inputDilog.show();"/>
                <p:dialog widgetVar="inputDilog" id="dialog">
                   <!-- custom component --> 
                   <practice:inputTextarea id="text" value="#{testBean.text}" maxlength="100"/>

                    <f:facet name="footer">
                        <p:commandButton id="button" title="Save text"
                                         update="textarea"
                                         process="text"
                                         oncomplete="inputDilog.hide();"/>
                    </f:facet>
                </p:dialog>
            </p:tab>
        </p:tabView>
    </h:form>

testBeanPOJO

@ManagedBean(name = "testBean")
@ViewScoped
public class TestBean implements Serializable {

    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

当我点击p:commandButton [id=button]时,我希望[id = textarea]的哪个组件会从[id = text]的组件中获取值。
但我得到了服务器的响应

 <update id="tabs:textarea"><![CDATA[<label id="tabs:textarea"></label>]]></update>

如果不是practice:inputTextareap:inputTextarea而是按预期工作 如果practice:inputTextarea的{​​{1}}位置也按预期工作。

为什么自定义组件位于p:tabView

时未处理practice:inputTextarea的值

1 个答案:

答案 0 :(得分:0)

我将复合组件包装到div中。现在一切正常。

复合组件现在看起来像

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:composite="http://java.sun.com/jsf/composite"
  xmlns:p="http://primefaces.org/ui"
  xmlns:h = "http://java.sun.com/jsf/html">
<composite:interface>
    ...
<composite:attribute name="maxlength" required="false" default="0"/>
<composite:attribute name="value" required="true"/>
    ...
</composite:interface>
<composite:implementation>
    <div id="#{cc.clientId}">
        <p:inputTextarea id="innerId"
                         value="#{cc.attrs.value}"
                         onkeyup="callJS('#{cc.clientId}:innerId', '#{cc.attrs.maxlength}')"/>
    </div>
</composite:implementation>
</html>