我想要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>
testBean
是POJO
@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:inputTextarea
写p:inputTextarea
而是按预期工作
如果practice:inputTextarea
的{{1}}位置也按预期工作。
为什么自定义组件位于p:tabView
?
practice:inputTextarea
的值
答案 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>